เชื่อมต่อฐานข้อมูล MySQL Python3
ในบทความนี้เราแนะนำ Python3 ใช้ PyMySQL เชื่อมต่อกับฐานข้อมูลและ CRUD ง่าย
PyMySQL คืออะไร?
PyMySQL สำหรับการเชื่อมต่อฐานข้อมูล MySQL รุ่นของเซิร์ฟเวอร์ใน Python3.x, Python2 ในการใช้งาน MySQLdb
PyMySQL ปฏิบัติตามข้อกำหนดหลามฐาน API v2.0 และมีห้องสมุดลูกค้าบริสุทธิ์หลาม MySQL
การติดตั้ง PyMySQL
ก่อนที่จะใช้ PyMySQL เราต้องให้แน่ใจ PyMySQL ติดตั้ง
PyMySQL ดาวน์โหลด: https: //github.com/PyMySQL/PyMySQL
ถ้าไม่ได้ติดตั้งแล้วเราสามารถใช้คำสั่งต่อไปนี้เพื่อติดตั้งรุ่นล่าสุดของ PyMySQL:
$ pip install PyMySQL
หากระบบของคุณไม่สนับสนุนคำสั่ง pip คุณสามารถใช้ต่อไปนี้การติดตั้ง:
1 โดยใช้คำสั่ง Git เพื่อดาวน์โหลดแพคเกจติดตั้ง (คุณยังสามารถดาวน์โหลดได้ด้วยตนเอง):
$ git clone https://github.com/PyMySQL/PyMySQL $ cd PyMySQL/ $ python3 setup.py install
2 ถ้าคุณต้องการที่จะพัฒนาหมายเลขรุ่นคุณสามารถใช้คำสั่งขดจะติดตั้ง:
$ # X.X 为 PyMySQL 的版本号 $ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz $ cd PyMySQL* $ python3 setup.py install $ # 现在你可以删除 PyMySQL* 目录
หมายเหตุ: ตรวจสอบว่าคุณมีสิทธิ์ root การติดตั้งโมดูลที่อธิบายข้างต้น
กระบวนการติดตั้งอาจปรากฏ "ImportError: ไม่มีโมดูลชื่อ setuptools" ข้อผิดพลาดซึ่งหมายความว่าคุณไม่ได้มีการติดตั้ง setuptools คุณสามารถเข้าถึง https://pypi.python.org/pypi/setuptools หาวิธีการติดตั้งของแต่ละระบบ
การติดตั้งลินุกซ์ตัวอย่าง:
$ wget https://bootstrap.pypa.io/ez_setup.py $ python3 ez_setup.py
เชื่อมต่อฐานข้อมูล
ก่อนที่จะเชื่อมต่อกับฐานข้อมูลให้แน่ใจว่ารายการต่อไปนี้:
- คุณได้สร้างฐานข้อมูล testdb
- ในฐานข้อมูล testdb คุณได้สร้างพนักงานตาราง
- พนักงาน FIRST_NAME ข้อมูลตาราง LAST_NAME อายุเพศและรายได้
- ผู้ใช้เชื่อมต่อกับฐานข้อมูลโดยใช้ TestDB ชื่อ "testuser" รหัสผ่าน "test123" คุณสามารถตั้งชื่อของคุณเองโดยตรงหรือรากของผู้ใช้และรหัสผ่าน, MySQL ใบอนุญาตผู้ใช้ฐานข้อมูลกรุณาใช้คำสั่งแกรนท์
- บนเครื่องของคุณติดตั้งไว้แล้วโมดูลหลาม MySQLdb
- ถ้าคุณไม่คุ้นเคยกับคำสั่ง SQL ที่คุณสามารถเยี่ยมชมของเรา พื้นฐาน SQL กวดวิชา
ตัวอย่าง:
ตัวอย่างต่อไปนี้ของการเชื่อมโยงฐานข้อมูล testdb Mysql:
#!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor() # 使用 execute() 方法执行 SQL 查询 cursor.execute("SELECT VERSION()") # 使用 fetchone() 方法获取单条数据. data = cursor.fetchone() print ("Database version : %s " % data) # 关闭数据库连接 db.close()
การดำเนินงานของสคริปดังกล่าวข้างต้นจะส่งผลมีดังนี้
Database version : 5.5.20-log
สร้างตารางฐานข้อมูล
ถ้าเราสามารถใช้การเชื่อมต่อฐานข้อมูลที่มีอยู่ดำเนินการ () วิธีการสร้างตารางฐานข้อมูลสำหรับการสร้างตารางพนักงานที่แสดงในต่อไปนี้:
#!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用 cursor() 方法创建一个游标对象 cursor cursor = db.cursor() # 使用 execute() 方法执行 SQL,如果表存在则删除 cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # 使用预处理语句创建表 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/python3 import pymysql # 打开数据库连接 db = pymysql.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: # 如果发生错误则回滚 db.rollback() # 关闭数据库连接 db.close()
ตัวอย่างข้างต้นยังสามารถเขียนได้ดังนี้
#!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.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) # 执行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/python3 import pymysql # 打开数据库连接 db = pymysql.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/python3 import pymysql # 打开数据库连接 db = pymysql.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/python3 import pymysql # 打开数据库连接 db = pymysql.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 |