หลามดำเนินงานฐานข้อมูล MySQL
ติดต่อฐานข้อมูลหลามมาตรฐานสำหรับหลาม DB-API, Python DB-API ให้โปรแกรมฐานข้อมูลที่อินเตอร์เฟซการเขียนโปรแกรมสำหรับนักพัฒนา
ติดต่อฐานข้อมูลหลามสนับสนุนฐานข้อมูลขนาดใหญ่มากคุณสามารถเลือกโครงการฐานข้อมูลของคุณ:
- ตัวเหลือบ
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- คำพยากรณ์
- Sybase
คุณสามารถเข้าถึง ติดต่อฐานข้อมูลและงูหลาม API ดูรายละเอียดของฐานข้อมูลที่ได้รับการสนับสนุน
ฐานข้อมูลที่แตกต่างกันคุณจะต้องดาวน์โหลดโมดูล DB API ที่แตกต่างกันตัวอย่างเช่นคุณจะต้องเข้าถึงฐานข้อมูล Oracle และข้อมูล MySQL, คุณจะต้องดาวน์โหลดโมดูลฐานข้อมูล Oracle และ MySQL
DB-API เป็นสเปคที่กำหนดชุดของวัตถุและฐานข้อมูลจะต้องเข้าถึงโหมดในการสั่งซื้อเพื่อให้อินเตอร์เฟซที่สอดคล้องกันในการเข้าถึงความหลากหลายของระบบฐานข้อมูลพื้นฐานและความหลากหลายของอินเตอร์เฟซโปรแกรมฐานข้อมูล
ธ DB-API สำหรับส่วนใหญ่ของฐานข้อมูลดำเนินการติดต่อที่ใช้หลังจากที่เชื่อมต่อฐานข้อมูลที่คุณสามารถใช้ลักษณะเดียวกันแต่ละฐานข้อมูล
งูหลาม DB-API ที่ใช้กระบวนการ:
- การแนะนำของโมดูล API
- รับการเชื่อมต่อกับฐานข้อมูล
- รันคำสั่งและวิธีการจัดเก็บ
- ปิดการเชื่อมต่อฐานข้อมูล
MySQLdb คืออะไร?
MySQLdb เป็นอินเตอร์เฟซสำหรับการเชื่อมโยงฐานข้อมูลหลาม MySQL, ซึ่งดำเนินหลาม Database API จะเป V2.0 ขึ้นอยู่กับสถานประกอบการของ MySQL C API ได้
วิธีการติดตั้ง MySQLdb?
การเขียนสคริปต์ MySQL ด้วย DB-API คุณต้องให้แน่ใจว่าคุณได้ติดตั้ง MySQL คัดลอกโค้ดต่อไปนี้และดำเนินการได้:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb
ถ้าผลการดังต่อไปนี้หลังจากการดำเนินการซึ่งหมายความว่าคุณไม่ได้มีโมดูล MySQLdb มีการติดตั้ง:
Traceback (most recent call last): File "test.py", line 3, in <module> import MySQLdb ImportError: No module named MySQLdb
ติดตั้ง MySQLdb เยี่ยมชม http://sourceforge.net/projects/mysql-python (แพลตฟอร์ม Linux สามารถเข้าถึง: https://pypi.python.org/pypi/MySQL-python ) จากที่นี่เลือกสำหรับแพลตฟอร์มของคุณ แพคเกจการติดตั้งจะแบ่งออกเป็นไบนารีก่อนรวบรวมและแพคเกจรหัสที่มา
หากคุณเลือกรุ่นไบนารีกระบวนการติดตั้งแจ้งให้ดำเนินการติดตั้งพื้นฐาน ถ้าติดตั้งจากซอร์สโค้ดคุณจะต้องสลับไป MySQLdb ไดเรกทอรีปล่อยระดับบนสุดและพิมพ์คำสั่งต่อไปนี้:
$ gunzip MySQL-python-1.2.2.tar.gz $ tar -xvf MySQL-python-1.2.2.tar $ cd MySQL-python-1.2.2 $ python setup.py build $ python setup.py install
หมายเหตุ: ตรวจสอบว่าคุณมีสิทธิ์ root การติดตั้งโมดูลที่อธิบายข้างต้น
เชื่อมต่อฐานข้อมูล
ก่อนที่จะเชื่อมต่อกับฐานข้อมูลให้แน่ใจว่ารายการต่อไปนี้:
- คุณได้สร้างฐานข้อมูล testdb
- ในฐานข้อมูล testdb คุณได้สร้างพนักงานตาราง
- พนักงาน FIRST_NAME ข้อมูลตาราง LAST_NAME อายุเพศและรายได้
- ผู้ใช้เชื่อมต่อกับฐานข้อมูลโดยใช้ TestDB ชื่อ "testuser" รหัสผ่าน "test123" คุณสามารถตั้งชื่อของคุณเองโดยตรงหรือรากของผู้ใช้และรหัสผ่าน, MySQL ใบอนุญาตผู้ใช้ฐานข้อมูลกรุณาใช้คำสั่งแกรนท์
- บนเครื่องของคุณติดตั้งไว้แล้วโมดูลหลาม MySQLdb
- ถ้าคุณไม่คุ้นเคยกับคำสั่ง SQL ที่คุณสามารถเยี่ยมชมของเรา พื้นฐาน SQL กวดวิชา
ตัวอย่าง:
ตัวอย่างต่อไปนี้ของการเชื่อมโยงฐานข้อมูล testdb Mysql:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # 使用execute方法执行SQL语句 cursor.execute("SELECT VERSION()") # 使用 fetchone() 方法获取一条数据库。 data = cursor.fetchone() print "Database version : %s " % data # 关闭数据库连接 db.close()
การดำเนินงานของสคริปดังกล่าวข้างต้นจะส่งผลมีดังนี้
Database version : 5.0.45
สร้างตารางฐานข้อมูล
ถ้าเราสามารถใช้การเชื่อมต่อฐานข้อมูลที่มีอยู่ดำเนินการ () วิธีการสร้างตารางฐานข้อมูลสำหรับการสร้างตารางพนักงานที่แสดงในต่อไปนี้:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # 如果数据表已经存在使用 execute() 方法删除表。 cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # 创建数据表SQL语句 sql = """CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )""" cursor.execute(sql) # 关闭数据库连接 db.close()
แทรกฐานข้อมูล
ตัวอย่างต่อไปนี้จะใช้ดำเนินการคำสั่ง SQL INSERT เพื่อแทรกระเบียนตารางพนักงานไปนี้:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 插入语句 sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try: # 执行sql语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # Rollback in case there is any error db.rollback() # 关闭数据库连接 db.close()
ตัวอย่างข้างต้นยังสามารถเขียนได้ดังนี้
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 插入语句 sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \ LAST_NAME, AGE, SEX, INCOME) \ VALUES ('%s', '%s', '%d', '%c', '%d' )" % \ ('Mac', 'Mohan', 20, 'M', 2000) try: # 执行sql语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # 发生错误时回滚 db.rollback() # 关闭数据库连接 db.close()
ตัวอย่าง:
รหัสต่อไปนี้ใช้ตัวแปรที่จะผ่านพารามิเตอร์ให้กับคำสั่ง SQL:
.................................. user_id = "test123" password = "password" con.execute('insert into Login values("%s", "%s")' % \ (user_id, password)) ..................................
สืบค้นฐานข้อมูล
งูหลาม MySQL Query ใช้ fetchone () วิธีการที่จะได้รับข้อมูลที่เดียวโดยใช้ fetchall () วิธีการที่จะได้รับส่วนใหญ่ของข้อมูล
- fetchone (): วิธีการนี้ได้รับชุดผลลัพธ์แบบสอบถามต่อไปชุดผลลัพธ์เป็นเป้าหมาย
- fetchall (): ผลตอบแทนในการรับแถวทั้งหมด
- rowcount: นี่คือคุณสมบัติอ่านอย่างเดียวและผลตอบแทนการดำเนินการดำเนินการ () วิธีการหลังจากที่จำนวนแถวที่ได้รับผลกระทบ
ตัวอย่าง:
ดูตารางพนักงานเงินเดือน (ค่าจ้าง) เขตข้อมูลเป็นใหญ่กว่าทุกรายการ 1000:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 查询语句 sql = "SELECT * FROM EMPLOYEE \ WHERE INCOME > '%d'" % (1000) try: # 执行SQL语句 cursor.execute(sql) # 获取所有记录列表 results = cursor.fetchall() for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # 打印结果 print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \ (fname, lname, age, sex, income ) except: print "Error: unable to fecth data" # 关闭数据库连接 db.close()
ผลการดำเนินการดังกล่าวข้างต้นสคริปต์มีดังนี้
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
การอัพเดทฐานข้อมูล
ข้อมูลการปรับปรุงการดำเนินงานสำหรับการปรับปรุงตารางข้อมูลตัวอย่างต่อไปนี้จะ TestDB ตารางฟิลด์เพศเปลี่ยนแปลงทั้งหมด 'M' ฟิลด์อายุจะเพิ่มขึ้นโดยที่ 1:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 更新语句 sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') try: # 执行SQL语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # 发生错误时回滚 db.rollback() # 关闭数据库连接 db.close()
การลบ
ลบข้อมูลลบข้อมูลสำหรับตารางตัวอย่างต่อไปนี้แสดงให้เห็นถึงลบข้อมูลในยุคตารางพนักงานเป็นจำนวนมากกว่า 20 ข้อมูลทั้งหมด:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 删除语句 sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # 执行SQL语句 cursor.execute(sql) # 提交修改 db.commit() except: # 发生错误时回滚 db.rollback() # 关闭连接 db.close()
ฝ่ายบริหาร
กลไกการทำธุรกรรมเพื่อให้สอดคล้องข้อมูล
บริการควรมีคุณสมบัติที่สี่: Atomicity ความสอดคล้องแยกความทนทาน สี่คุณสมบัติเหล่านี้มักจะถูกเรียกว่าคุณสมบัติกรด
- อะตอม (อะตอมมิกซิตี้) ธุรกรรมเป็นหน่วยแบ่งแยกการทำงานดำเนินการดังกล่าวจะรวมอยู่ในการทำธุรกรรมที่จะทำหรือไม่ทำ
- ความสอดคล้อง (สอดคล้อง) บริการต้องมีการเปลี่ยนแปลงเพื่อให้ฐานข้อมูลจากสถานะที่สอดคล้องกันหนึ่งไปยังอีกสถานะที่สอดคล้องกัน สอดคล้องและ atomicity เกี่ยวข้องอย่างใกล้ชิด
- การแยก (แยก) ดำเนินการทำธุรกรรมไม่สามารถทำธุรกรรมอื่น ๆ รบกวน นั่นคือการดำเนินการภายในของการทำธุรกรรมและการใช้งานของคนอื่น ๆ เห็นพ้องด้วยการทำธุรกรรมข้อมูลโดดเดี่ยวและไม่สามารถรบกวนกันระหว่างทำธุรกรรมแต่ละดำเนินการควบคู่กันไป
- วิริยะ (ความทนทาน) ถาวรที่เรียกว่าถาวร (ถาวร) ก็หมายความว่าเมื่อการทำธุรกรรมที่กระทำการเปลี่ยนแปลงข้อมูลในฐานข้อมูลควรเป็นแบบถาวร ต่อไปนี้การดำเนินงานอื่น ๆ หรือความล้มเหลวที่ไม่ควรมีผลกระทบใด ๆ
งูหลาม DB API 2.0 มีสองวิธีการของการทำธุรกรรมกระทำหรือย้อนกลับ
ตัวอย่าง:
# SQL删除记录语句 sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # 执行SQL语句 cursor.execute(sql) # 向数据库提交 db.commit() except: # 发生错误时回滚 db.rollback()
สำหรับฐานข้อมูลการทำธุรกรรมการเขียนโปรแกรมฐานข้อมูลในหลามเมื่อเคอร์เซอร์จะจัดตั้งขึ้นโดยอัตโนมัติเริ่มต้นการทำธุรกรรมฐานข้อมูลที่มองไม่เห็น
กระทำ () วิธีการสำหรับทุกเคอร์เซอร์อัพเดทย้อนกลับ () วิธีการที่จะย้อนกลับการดำเนินงานทั้งหมดของเคอร์เซอร์ปัจจุบัน แต่ละวิธีได้เริ่มต้นธุรกิจใหม่
จัดการข้อผิดพลาด
DB API กำหนดข้อผิดพลาดบางอย่างและการทำงานผิดปกติของฐานข้อมูลตารางต่อไปนี้แสดงข้อผิดพลาดและข้อยกเว้นนี้:
ผิดปกติ | ลักษณะ |
---|---|
การเตือน | เมื่อมีการเตือนภัยที่ร้ายแรงที่จะเรียกเช่นการใส่ข้อมูลที่ถูกตัดทอนและอื่น ๆ มันจะต้องเป็น subclass ของ StandardError |
ความผิดพลาด | เรียนข้อผิดพลาดอื่น ๆ ทั้งหมดอื่นนอกเหนือจากคำเตือน มันจะต้องเป็น subclass ของ StandardError |
InterfaceError | ไฟไหม้เมื่อโมดูลอินเตอร์เฟซฐานข้อมูลมีข้อผิดพลาดของตัวเอง (แทนของฐานข้อมูลผิดพลาด) เกิดขึ้น มันจะต้องเป็น subclass ของข้อผิดพลาด |
DatabaseError | ทริกเกอร์และข้อผิดพลาดที่เกี่ยวข้องกับฐานข้อมูล มันจะต้องเป็น subclass ของข้อผิดพลาด |
DataError | เมื่อมีข้อผิดพลาดเกิดขึ้นในการประมวลผลข้อมูลเมื่อมีการเรียกตัวอย่างเช่น: หารด้วยศูนย์ข้อผิดพลาดข้อมูลที่ออกจากช่วงและอื่น ๆ มันจะต้องเป็น subclass ของ DatabaseError |
OperationalError | มันหมายถึงไม่ใช่ผู้ใช้ควบคุม แต่ข้อผิดพลาดที่เกิดขึ้นขณะที่ฐานข้อมูล ตัวอย่างเช่นการเชื่อมต่อโดยบังเอิญชื่อฐานข้อมูลไม่พบการทำธุรกรรมที่ล้มเหลวผิดพลาดการจัดสรรหน่วยความจำ ฯลฯ ข้อผิดพลาดฐานข้อมูลการดำเนินงานที่เกิดขึ้น มันจะต้องเป็น subclass ของ DatabaseError |
IntegrityError | ข้อผิดพลาดที่สมบูรณ์ที่เกี่ยวข้องเช่นการตรวจสอบที่สำคัญต่างประเทศล้มเหลวและไม่ชอบ มันจะต้องเป็น DatabaseError subclass |
InternalError | ข้อผิดพลาดของระบบฐานข้อมูลภายในเช่นเคอร์เซอร์ (เคอร์เซอร์) ล้มเหลวของการประสานความล้มเหลวการทำธุรกรรมและอื่น ๆ มันจะต้องเป็น DatabaseError subclass |
ProgrammingError | ข้อผิดพลาดในการดำเนินการดังกล่าวเป็นตารางข้อมูล (ตาราง) ไม่พบหรือมีอยู่แล้วข้อผิดพลาดคำสั่ง SQL ไวยากรณ์หมายเลขข้อผิดพลาดของพารามิเตอร์และอื่น ๆ มันจะต้องเป็น subclass ของ DatabaseError |
NotSupportedError | ไม่สนับสนุนข้อผิดพลาดหมายถึงการใช้ฟังก์ชั่นเช่น API หรือฐานข้อมูลไม่สนับสนุน ตัวอย่างเช่นการใช้ .rollback บนวัตถุการเชื่อมต่อ () ฟังก์ชัน แต่ฐานข้อมูลไม่สนับสนุนการทำธุรกรรมหรือการทำธุรกรรมได้ถูกปิด มันจะต้องเป็น subclass ของ DatabaseError |