上一页下一页
数据库接口的 Python 标准是 Python DB-API。大多数 Python 数据库接口都遵循此标准。
您可以为您的应用程序选择正确的数据库。 Python 数据库 API 支持广泛的数据库服务器,例如 -
- GadFly
- mSQL
- MySQL
- PostgreSQL
- 微软 SQL Server 2000
- Informix
- Interbase
- 甲骨文
- Sybase
以下是可用 Python 数据库接口的列表:Python 数据库接口和 API。您必须为需要访问的每个数据库下载单独的 DB API 模块。例如,如果您需要访问 Oracle 数据库和 MySQL 数据库,则必须同时下载 Oracle 和 MySQL 数据库模块。
DB API 提供了一个尽可能使用 Python 结构和语法处理数据库的最低标准。此 API 包括以下内容 -
- 导入 API 模块。
- 获取与数据库的连接。
- 发出 SQL 语句和存储过程。
- 关闭连接
MySQL 的所有概念我们都会学习到,所以让我们来谈谈 MySQLdb 模块。
什么是 MySQLdb?
MySQLdb 是一个用于从 Python 连接到 MySQL 数据库服务器的接口。它实现了 Python 数据库 API v2.0,并建立在 MySQL C API 之上。
如何安装 MySQLdb?
在继续之前,请确保您的机器上安装了 MySQLdb。只需在您的 Python 脚本中输入以下内容并执行它 -
#!/usr/bin/pythonimport MySQLdb
如果它产生以下结果,则表示未安装 MySQLdb 模块 -
回溯(最近一次调用最后一次):文件“test.py”,第 3 行,在中 import MySQLdbImportError:No module named MySQLdb
要安装 MySQLdb 模块,请使用以下命令 -
对于 Ubuntu,使用以下命令 -$ sudo apt-get install python-pip python-dev libmysqlclient-dev 对于 Fedora,使用以下命令 -$ sudo dnf install python python-devel mysql-devel redhat-rpm-config gcc对于Python命令提示符,使用如下命令-pip install MySQL-python
注意 − 确保您具有安装上述模块的 root 权限。
数据库连接
在连接到 MySQL 数据库之前,请确保以下事项 -
-
您已经创建了一个数据库 TESTDB。
-
您已经在 TESTDB 中创建了一个表 EMPLOYEE。
-
此表包含字段 FIRST_NAME、LAST_NAME、AGE、SEX 和 INCOME。
-
设置用户ID“testuser”和密码“test123”访问TESTDB。
-
Python 模块 MySQLdb 已正确安装在您的机器上。
-
您已经通过 MySQL 教程了解 MySQL 基础知识。
示例
以下是连接MySQL数据库“TESTDB”的例子
#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db =MySQLdb.connect("localhost","testuser","test123","TESTDB")# 使用 <准备一个游标对象i>光标() methodcursor =db.cursor()# 使用 execute() 执行 SQL 查询 method.cursor.execute("SELECT VERSION()")#使用fetchone()获取单行 method.data =cursor.fetchone()print "Database version :%s " % data# 从 serverdb.close() 断开
运行此脚本时,它在我的 Linux 机器上产生以下结果。
数据库版本:5.0.45
如果与数据源建立连接,则返回一个连接对象并保存到 db 供进一步使用,否则 db 设置为无。接下来,db 对象用于创建光标 对象,该对象又用于执行 SQL 查询。最后,在出来之前,保证关闭数据库连接,释放资源。
创建数据库表
一旦建立了数据库连接,我们就可以使用 execute 在数据库表中创建表或记录 创建游标的方法。
示例
让我们创建数据库表 EMPLOYEE -
#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db =MySQLdb.connect("localhost","testuser","test123","TESTDB")# 使用 <准备一个游标对象i>光标() methodcursor =db.cursor()# 使用execute()删除已经存在的表 method.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) , 收入浮动 )"""cursor.execute(sql)# 从 serverdb.close() 断开
插入操作
要将记录创建到数据库表中时需要它。
示例
下面的例子,执行 SQL INSERT 在 EMPLOYEE 表中创建记录的语句 -
#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db =MySQLdb.connect("localhost","testuser","test123","TESTDB")# 使用 <准备一个游标对象i>光标() methodcursor =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()#与 serverdb.close() 断开连接
上面的例子可以写成如下动态创建 SQL 查询 -
#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db =MySQLdb.connect("localhost","testuser","test123","TESTDB")# 使用 <准备一个游标对象i>光标() methodcursor =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) # Commit您在数据库中的更改 db.commit()except:# 回滚以防出现任何错误 db.rollback()# disconnect from serverdb.close()
示例
以下代码段是另一种执行形式,您可以直接传递参数 -
.................................user_id ="test123"password ="password"con.execute('insert into Login values("%s", "%s")' % \ (user_id, password))......... ......
读操作
READ 对任何数据库的操作意味着从数据库中获取一些有用的信息。
一旦我们的数据库连接建立,您就可以开始查询这个数据库了。您可以使用 fetchone() 获取单个记录的方法或 fetchall() 从数据库表中获取多个值的方法。
-
fetchone() − 获取查询结果集的下一行。结果集是使用游标对象查询表时返回的对象。
-
fetchall() - 它获取结果集中的所有行。如果已经从结果集中提取了一些行,则从结果集中检索剩余的行。
-
行数 − 这是一个只读属性,返回受 execute() 方法影响的行数。
示例
下面的过程查询EMPLOYEE表中工资大于1000的所有记录 -
#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db =MySQLdb.connect("localhost","testuser","test123","TESTDB")# 使用 <准备一个游标对象i>光标() methodcursor =db.cursor()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:打印 "错误:无法获取数据"# 断开连接来自 serverdb.close()
这将产生以下结果 -
fname=Mac,lname=Mohan,age=20,sex=M,收入=2000
更新操作
UPDATE 对任何数据库的操作是更新一个或多个数据库中已有的记录。
以下过程更新所有 SEX 为 'M' 的记录 .在这里,我们将所有雄性的 AGE 增加一年。
示例
#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db =MySQLdb.connect("localhost","testuser","test123","TESTDB")# 使用 <准备一个游标对象i>光标() methodcursor =db.cursor()# 准备 SQL 查询以更新所需的记录sql ="UPDATE EMPLOYEE SET AGE =AGE + 1 WHERE SEX ='%c'" % ('M')try:# 执行 SQL 命令 cursor.execute( sql) # 在数据库中提交您的更改 db.commit()except:# 回滚以防出现任何错误 db.rollback()# 从 serverdb.close() 断开
删除操作
当您要从数据库中删除某些记录时,需要执行 DELETE 操作。以下是从 EMPLOYEE 中删除 AGE 大于 20 的所有记录的过程 -
示例
#!/usr/bin/pythonimport MySQLdb# 打开数据库连接db =MySQLdb.connect("localhost","testuser","test123","TESTDB")# 使用 <准备一个游标对象i>光标() methodcursor =db.cursor()# 准备 SQL 查询以删除所需的记录sql ="DELETE FROM EMPLOYEE WHERE AGE> '%d'" % (20)try:# 执行 SQL 命令 cursor.execute(sql) # 在数据库 db.commit()except:# 回滚以防出现任何错误 db.rollback()# 从 serverdb.close() 断开
执行交易
事务是一种确保数据一致性的机制。交易具有以下四个属性 -
-
原子性 − 交易完成或什么都不发生。
-
一致性 − 事务必须以一致状态开始,并使系统处于一致状态。
-
隔离 − 事务的中间结果在当前事务之外不可见。
-
耐用性 − 事务一旦提交,即使在系统出现故障后,影响也是持久的。
Python DB API 2.0 提供了两种方法来提交 或 回滚 一笔交易。
示例
您已经知道如何实现事务。这又是一个类似的例子 -
# 准备 SQL 查询以删除所需的记录sql ="DELETE FROM EMPLOYEE WHERE AGE> '%d'" % (20)try:# 执行 SQL 命令 cursor.execute(sql) # Commit your数据库中的变化 db.commit()except:# 回滚以防出现任何错误 db.rollback()
提交操作
Commit是一个操作,给数据库一个绿色的信号来完成更改,此操作后,任何更改都无法恢复。
这是一个调用 commit 的简单示例 方法。
db.commit()
回滚操作
如果您对一项或多项更改不满意,并且想要完全还原这些更改,请使用 rollback() 方法。
这是调用 rollback() 的简单示例 方法。
db.rollback()
断开数据库
要断开数据库连接,请使用 close() 方法。
db.close()
如果用户使用 close() 方法关闭了与数据库的连接,则数据库将回滚任何未完成的事务。但是,您的应用程序最好不要依赖于任何 DB 较低级别的实现细节,而最好显式调用 commit 或 rollback。
处理错误
错误的来源有很多。一些示例是已执行的 SQL 语句中的语法错误、连接失败或为已取消或已完成的语句句柄调用 fetch 方法。
DB API 定义了许多错误,这些错误必须存在于每个数据库模块中。下表列出了这些例外情况。
Sr.No. | 异常和描述 |
---|---|
1 | 警告 用于非致命问题。必须继承 StandardError。 |
2 | 错误 错误的基类。必须继承 StandardError。 |
3 | 接口错误 用于数据库模块中的错误,而不是数据库本身。必须对 Error 进行子类化。 |
4 | 数据库错误 用于数据库中的错误。必须对 Error 进行子类化。 |
5 | 数据错误 DatabaseError 的子类,指的是数据中的错误。 |
6 | 操作错误 DatabaseError 的子类,指的是错误,例如与数据库的连接丢失。这些错误通常不在 Python 脚本编写者的控制范围内。 |
7 | 完整性错误 DatabaseError 的子类,用于可能破坏关系完整性的情况,例如唯一性约束或外键。 |
8 | 内部错误 DatabaseError 的子类,指的是数据库模块内部的错误,例如游标不再处于活动状态。 |
9 | 编程错误 DatabaseError 的子类,它指的是错误,例如错误的表名和其他可以安全归咎于您的事情。 |
10 | NotSupportedError DatabaseError 的子类,指的是尝试调用不受支持的功能。 |
您的 Python 脚本应该处理这些错误,但在使用上述任何异常之前,请确保您的 MySQLdb 支持该异常。您可以通过阅读 DB API 2.0 规范来获取有关它们的更多信息。
Python