📜  Python 3-MySQL数据库访问

📅  最后修改于: 2020-12-23 05:02:37             🧑  作者: Mango


用于数据库接口的Python标准是Python DB-API。大多数Python数据库接口都遵守该标准。

您可以为您的应用程序选择正确的数据库。 Python Database API支持各种数据库服务器,例如-

  • SQL
  • 的MySQL
  • PostgreSQL的
  • Microsoft SQL Server 2000
  • Informix
  • 基地间
  • 甲骨文
  • Sybase公司
  • SQLite的

这是可用的Python数据库接口的列表Python数据库接口和API 。您必须为需要访问的每个数据库下载一个单独的DB API模块。例如,如果您需要访问Oracle数据库和MySQL数据库,则必须同时下载Oracle和MySQL数据库模块。

DB API为使用Python结构和语法处理数据库提供了最低标准。该API包括以下内容-

  • 导入API模块。
  • 获取与数据库的连接。
  • 发出SQL语句和存储过程。
  • 断开连接

Python对SQLite具有内置支持。在本节中,我们将学习使用MySQL的所有概念。 MySQLdb模块是MySQL的流行接口,它与Python 3不兼容。相反,我们将使用PyMySQL模块。

什么是PyMySQL?

PyMySQL是用于从Python连接到MySQL数据库服务器的接口。它实现了Python数据库API v2.0,并包含一个纯Python MySQL客户端库。 PyMySQL的目标是替代MySQLdb。

如何安装PyMySQL?

在继续之前,请确保您的计算机上已安装PyMySQL。只需在Python脚本中键入以下内容并执行它-

#!/usr/bin/python3

import pymysql

如果产生以下结果,则表示未安装MySQLdb模块-

Traceback (most recent call last):
   File "test.py", line 3, in 
      Import pymysql
ImportError: No module named pymysql

最新的稳定版本可在PyPI上获得,并可与pip一起安装-

pip install pymysql

另外(例如,如果没有pip),可以从GitHub下载tarball并使用Setuptools进行安装,如下所示-

$ # X.X is the desired pymysql version (e.g. 0.5 or 0.6).
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz
$ cd PyMySQL*
$ python setup.py install
$ # The folder PyMySQL* can be safely removed now.

注意-确保您具有root特权来安装上述模块。

数据库连接

连接到MySQL数据库之前,请确保以下几点-

  • 您已经创建了数据库TESTDB。

  • 您已经在TESTDB中创建了一个表EMPLOYEE。

  • 该表包含字段FIRST_NAME,LAST_NAME,AGE,SEX和INCOME。

  • 用户ID“ testuser”和密码“ test123”设置为访问TESTDB。

  • Python模块PyMySQL已正确安装在您的计算机上。

  • 您已经阅读了MySQL教程,以了解MySQL基础。

以下是连接MySQL数据库“ TESTDB”的示例-

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")

# Fetch a single row using fetchone() method.
data = cursor.fetchone()
print ("Database version : %s " % data)

# disconnect from server
db.close()

运行此脚本时,它将产生以下结果。

Database version : 5.5.20-log

如果与数据源建立了连接,则将返回连接对象并将其保存到db中以备将来使用,否则db设置为None。接下来, db对象用于创建游标对象,该游标对象又用于执行SQL查询。最后,在发布之前,它确保关闭数据库连接并释放资源。

创建数据库表

建立数据库连接后,我们准备使用创建的游标的execute方法在数据库表中创建表或记录。

让我们创建一个数据库表EMPLOYEE-

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

# Create table as per requirement
sql = """CREATE TABLE EMPLOYEE (
   FIRST_NAME  CHAR(20) NOT NULL,
   LAST_NAME  CHAR(20),
   AGE INT,  
   SEX CHAR(1),
   INCOME FLOAT )"""

cursor.execute(sql)

# disconnect from server
db.close()

插入操作

要在数据库表中创建记录时,需要执行INSERT操作。

以下示例执行SQL INSERT语句以在EMPLOYEE表中创建记录-

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
   LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

可以将上面的示例编写如下,以动态创建SQL查询-

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
   LAST_NAME, AGE, SEX, INCOME) \
   VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
   ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

以下代码段是另一种执行形式,您可以在其中直接传递参数-

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

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

读操作

任何数据库上的READ操作意味着要从数据库中获取一些有用的信息。

建立数据库连接后,就可以对这个数据库进行查询了。您可以使用fetchone()方法来获取单个记录或使用fetchall()方法来从数据库表中读取多个值。

  • fetchone() -它获取查询结果集的下一行。结果集是在使用游标对象查询表时返回的对象。

  • fetchall() -提取结果集中的所有行。如果已经从结果集中提取了一些行,则它将从结果集中检索剩余的行。

  • rowcount-这是一个只读属性,返回受execute()方法影响的行数。

以下过程从薪水超过1000的EMPLOYEE表中查询所有记录-

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = "SELECT * FROM EMPLOYEE \
      WHERE INCOME > '%d'" % (1000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Fetch all the rows in a list of lists.
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
      # Now print fetched result
      print ("fname = %s,lname = %s,age = %d,sex = %s,income = %d" % \
         (fname, lname, age, sex, income ))
except:
   print ("Error: unable to fetch data")

# disconnect from server
db.close()

输出

这将产生以下结果-

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

更新操作

UPDATE对任何数据库的操作意味着更新一个或多个记录,这些记录已经在数据库中可用。

以下过程更新SEX为‘M’的所有记录。在这里,我们将所有男性的年龄提高了一年。

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
                          WHERE SEX = '%c'" % ('M')
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

删除操作

要从数据库中删除某些记录时,需要执行DELETE操作。以下是从AGE大于20的EMPLOYEE删除所有记录的过程-

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

执行交易

事务是一种确保数据一致性的机制。事务具有以下四个属性-

  • 原子性-事务完成还是什么都没有发生。

  • 一致性-事务必须以一致状态开始,并使系统保持一致状态。

  • 隔离-交易的中间结果在当前交易之外不可见。

  • 持久性-提交事务后,即使在系统出现故障后,效果也将持久。

Python DB API 2.0提供了两种方法来提交回滚事务。

您已经知道如何实现事务。这是一个类似的例子-

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

提交操作

提交是一项操作,它向数据库发出绿色信号以完成更改,并且在执行此操作后,将无法还原任何更改。

这是一个调用commit方法的简单示例。

db.commit()

回滚操作

如果您对一项或多项更改不满意,并且想要完全还原这些更改,请使用rollback()方法。

这是一个调用rollback()方法的简单示例。

db.rollback()

断开数据库

要断开数据库连接,请使用close()方法。

db.close()

如果用户使用close()方法关闭了与数据库的连接,则所有未完成的事务都会由数据库回滚。但是,您的应用程序最好不显式调用commit或rollback,而不是依赖于任何数据库较低级别的实现细节。

处理错误

错误的来源很多。一些示例是已执行的SQL语句中的语法错误,连接失败或为已取消或完成的语句句柄调用fetch方法。

DB API定义了每个数据库模块中必须存在的许多错误。下表列出了这些例外。

Sr.No. Exception & Description
1

Warning

Used for non-fatal issues. Must subclass StandardError.

2

Error

Base class for errors. Must subclass StandardError.

3

InterfaceError

Used for errors in the database module, not the database itself. Must subclass Error.

4

DatabaseError

Used for errors in the database. Must subclass Error.

5

DataError

Subclass of DatabaseError that refers to errors in the data.

6

OperationalError

Subclass of DatabaseError that refers to errors such as the loss of a connection to the database. These errors are generally outside of the control of the Python scripter.

7

IntegrityError

Subclass of DatabaseError for situations that would damage the relational integrity, such as uniqueness constraints or foreign keys.

8

InternalError

Subclass of DatabaseError that refers to errors internal to the database module, such as a cursor no longer being active.

9

ProgrammingError

Subclass of DatabaseError that refers to errors such as a bad table name and other things that can safely be blamed on you.

10

NotSupportedError

Subclass of DatabaseError that refers to trying to call unsupported functionality.

您的Python脚本应处理这些错误,但是在使用上述任何异常之前,请确保MySQLdb支持该异常。您可以通过阅读DB API 2.0规范来获取有关它们的更多信息。