Latest web development tutorials

หลามดำเนินงานฐานข้อมูล 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