Python mengendalikan pangkalan data MySQL


Antara muka pangkalan data standard Python ialah Python DB-API, yang menyediakan antara muka pengaturcaraan aplikasi pangkalan data kepada pembangun.

Antara muka pangkalan data Python menyokong banyak pangkalan data, anda boleh memilih pangkalan data yang sesuai dengan projek anda:

  • GadFly

  • mSQL

  • MySQL

  • PostgreSQL

  • Microsoft SQL Server 2000

    <🎜
  • Informix

  • Interbase

  • Oracle

  • Sybase

Anda boleh melawati antara muka pangkalan data Python dan API untuk melihat senarai terperinci pangkalan data yang disokong.

Anda perlu memuat turun modul DB API yang berbeza untuk pangkalan data yang berbeza Contohnya, jika anda perlu mengakses pangkalan data Oracle dan data Mysql, anda perlu memuat turun modul pangkalan data Oracle dan MySQL.

DB-API ialah spesifikasi Ia mentakrifkan satu siri objek yang diperlukan dan kaedah capaian pangkalan data untuk menyediakan antara muka akses yang konsisten untuk pelbagai sistem pangkalan data asas dan pelbagai program antara muka pangkalan data.

DB-API Python melaksanakan antara muka untuk kebanyakan pangkalan data Selepas menggunakannya untuk menyambung ke setiap pangkalan data, anda boleh mengendalikan setiap pangkalan data dengan cara yang sama.

Proses penggunaan Python DB-API:

  • Perkenalkan modul API.

  • Dapatkan sambungan ke pangkalan data.

  • Melaksanakan pernyataan SQL dan prosedur tersimpan.

  • Tutup sambungan pangkalan data.


Apakah MySQLdb?

MySQLdb ialah antara muka untuk Python untuk menyambung ke pangkalan data Mysql Ia melaksanakan spesifikasi API pangkalan data Python V2.0 dan berasaskan pada MySQL C Dibina pada API.


Bagaimana untuk memasang MySQLdb?

Untuk menulis skrip MySQL dengan DB-API, anda mesti memastikan MySQL dipasang. Salin kod berikut dan laksanakannya:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

Jika output selepas pelaksanaan adalah seperti berikut, bermakna anda belum memasang modul MySQLdb:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    import MySQLdb
ImportError: No module named MySQLdb

Untuk memasang MySQLdb, sila layari http:/ /sourceforge.net/projects/mysql-python , (Platform Linux boleh mengakses: https://pypi.python.org/pypi/MySQL-python) Dari sini, anda boleh memilih pakej pemasangan yang sesuai untuk platform anda, yang dibahagikan ke dalam fail binari yang telah disusun sebelumnya dan pakej pemasangan kod sumber.

Jika anda memilih versi pengedaran fail binari, proses pemasangan boleh diselesaikan dengan gesaan pemasangan asas. Jika memasang daripada kod sumber, anda perlu beralih ke direktori peringkat atas pengedaran MySQLdb dan taip arahan berikut:

$ 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

Nota: Sila pastikan anda mempunyai kebenaran root untuk memasang modul di atas.


Sambungan pangkalan data

Sebelum menyambung ke pangkalan data, sila sahkan perkara berikut:

  • Anda telah mencipta pangkalan data TESTDB.

  • Dalam pangkalan data TESTDB anda telah mencipta jadual PEKERJA

  • Medan jadual PEKERJA ialah FIRST_NAME, LAST_NAME, UMUR, JANTINA dan PENDAPATAN.

  • Nama pengguna yang digunakan untuk menyambung ke pangkalan data TESTDB ialah "testuser" dan kata laluannya ialah "test123". kebenaran pengguna Sila gunakan arahan Geran.

  • Modul Python MySQLdb telah dipasang pada mesin anda.

  • Jika anda tidak biasa dengan pernyataan sql, anda boleh melawati tutorial SQL asas kami

Contoh:

Contoh berikut dipautkan ke Pangkalan Data 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()

Hasil output melaksanakan skrip di atas adalah seperti berikut:

Database version : 5.0.45

Buat jadual pangkalan data

Jika sambungan pangkalan data wujud, kita boleh gunakan kaedah execute() untuk mencipta Jadual jadual pangkalan data, buat PEKERJA jadual seperti berikut:

#!/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()

Operasi memasukkan pangkalan data

Contoh berikut menggunakan pernyataan SQL INSERT untuk memasukkan rekod ke dalam jadual PEKERJA:

#!/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()

Contoh di atas Ia juga boleh ditulis dalam bentuk berikut:

#!/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()

Contoh:

Kod berikut menggunakan pembolehubah untuk menghantar parameter kepada pernyataan SQL:

..................................
user_id = "test123"
password = "password"

con.execute('insert into Login values("%s", "%s")' % \
             (user_id, password))
..................................

Operasi pertanyaan pangkalan data

Python pertanyaan Mysql menggunakan kaedah fetchone() untuk mendapatkan sekeping data tunggal, dan kaedah fetchall() untuk mendapatkan berbilang keping data.

  • fetchone(): Kaedah ini mendapat set hasil pertanyaan seterusnya. Set hasil ialah objek

  • fetchall():Menerima semua baris hasil yang dikembalikan.

  • rowcount : Ini ialah sifat baca sahaja dan mengembalikan bilangan baris yang terjejas selepas melaksanakan kaedah execute().

Contoh:

Soal semua data dengan medan gaji lebih daripada 1000 dalam jadual PEKERJA:

#!/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()

Hasil pelaksanaan skrip di atas adalah seperti berikut :

fname=Mac, lname=Mohan, age=20, sex=M, income=2000

Operasi kemas kini pangkalan data

Operasi kemas kini digunakan untuk mengemas kini data dalam jadual data Contoh berikut menukar semua medan SEX dalam jadual TESTDB kepada 'M'. , dan medan AGE bertambah sebanyak 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()

Operasi padam

Operasi pemadaman digunakan untuk memadamkan data dalam jadual data. Contoh berikut menunjukkan pemadaman semua data dengan UMUR lebih daripada 20 dalam jadual data PEKERJA:

#!/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()

Melaksanakan urus niaga

Mekanisme transaksi boleh memastikan ketekalan data.

Transaksi harus mempunyai 4 atribut: atomicity, konsistensi, pengasingan dan ketahanan. Empat sifat ini sering dipanggil sifat ASID.

  • Atomicity. Urus niaga ialah unit kerja yang tidak boleh dibahagikan Semua operasi yang termasuk dalam urus niaga sama ada dilakukan atau tiada.

  • Ketekalan. Sesuatu transaksi mesti menukar pangkalan data daripada satu keadaan konsisten kepada yang lain. Konsistensi dan atomicity berkait rapat.

  • Pengasingan. Pelaksanaan transaksi tidak boleh diganggu oleh transaksi lain. Iaitu, operasi dan data yang digunakan dalam urus niaga diasingkan daripada urus niaga serentak yang lain, dan urus niaga yang dilaksanakan secara serentak tidak boleh mengganggu satu sama lain.

  • Ketahanan. Kesinambungan, juga dikenali sebagai kekekalan, bermaksud bahawa setelah transaksi dilakukan, perubahannya kepada data dalam pangkalan data harus kekal. Operasi atau kegagalan seterusnya tidak sepatutnya mempunyai sebarang kesan ke atasnya.

Transaksi Python DB API 2.0 menyediakan dua kaedah commit atau rollback.

Contoh:

# SQL删除记录语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 向数据库提交
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()

Untuk pangkalan data yang menyokong urus niaga, dalam pengaturcaraan pangkalan data Python, apabila kursor dicipta, transaksi pangkalan data yang tidak kelihatan dimulakan secara automatik.

Kaedah commit() melaksanakan semua operasi kemas kini pada kursor, dan kaedah rollback() melancarkan semula semua operasi pada kursor semasa. Setiap kaedah memulakan transaksi baharu.


Ralat pengendalian

DB API mentakrifkan beberapa ralat dan pengecualian untuk operasi pangkalan data Jadual berikut menyenaraikan ralat dan pengecualian ini:

异常描述
Warning当有严重警告时触发,例如插入数据是被截断等等。必须是 StandardError 的子类。
Error警告以外所有其他错误类。必须是 StandardError 的子类。
InterfaceError当有数据库接口模块本身的错误(而不是数据库的错误)发生时触发。 必须是Error的子类。
DatabaseError和数据库有关的错误发生时触发。 必须是Error的子类。
DataError当有数据处理时的错误发生时触发,例如:除零错误,数据超范围等等。            必须是DatabaseError的子类。
OperationalError指非用户控制的,而是操作数据库时发生的错误。例如:连接意外断开、            数据库名未找到、事务处理失败、内存分配错误等等操作数据库是发生的错误。            必须是DatabaseError的子类。
IntegrityError完整性相关的错误,例如外键检查失败等。必须是DatabaseError子类。
InternalError数据库的内部错误,例如游标(cursor)失效了、事务同步失败等等。            必须是DatabaseError子类。
ProgrammingError程序错误,例如数据表(table)没找到或已存在、SQL语句语法错误、            参数数量错误等等。必须是DatabaseError的子类。
NotSupportedError不支持错误,指使用了数据库不支持的函数或API等。例如在连接对象上            使用.rollback()函数,然而数据库并不支持事务或者事务已关闭。            必须是DatabaseError的子类。