Python MySQL(MySQLdb)
Python标准的数据库接口的Python DB-API(包括Python操作MySQL)。大多数Python数据库接口坚持这个标准。
Python标准的数据库接口的Python DB-API。大多数Python数据库接口坚持这个标准。.
你可以选择适合您应用的数据库。 Python数据库API支持范围广泛的数据库服务器:
GadFly
mSQL
MySQL
PostgreSQL
Microsoft SQL Server 2000
Informix
Interbase
Oracle
Sybase
下面是可用的Python数据库接口的列表:
Python Database Interfaces and APIs
你必须下载一个单独的DB API的模块,你需要访问的每个数据库。例如,如果你需要访问Oracle数据库以及MySQL数据库,你必须下载Oracle和MySQL数据库模块.
DB API提供了与数据库的工作,尽可能使用Python的结构和语法的最低标准。这个API包括以下:
- 导入API模块.
- 获取与数据库的连接.
- 发出SQL语句和存储过程.
- 关闭连接
我们这里将仅学习使用MySQL的所有概念,所以让我们来谈谈MySQLdb模块.
什么是MySQLdb?
MySQLdb的是一个接口连接到MySQL数据库服务器从Python。它实现了Python数据库API V2.0,并建上的MySQL C API的顶端.
我怎么安装MySQLdb?
在进行之前,您确认您已经MySQLdb的机器上安装。只是在你的Python脚本键入以下命令并执行它:
#!/usr/bin/python
import MySQLdb
如果它产生以下结果,那么它意味着未安装MySQLdb模块:
Traceback (most recent call last):
File "test.py", line 3, inimport MySQLdb
ImportError: No module named MySQLdb
安装MySQLdb模块,MySQLdb的下载页面下载并进行如下,
window平台可以到http://www.codegood.com/archives/4 下载:
$ 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权限来安装上述模块.
数据库连接:
连接到一个MySQL数据库之前确保以下:
- 你已经创建了一个数据库TESTDB.
- 你已经创建了一个EMPLOYEE表在TESTDB中.
- EMPLOYEE表有以下几个字段: FIRST_NAME, LAST_NAME, AGE, SEX and INCOME.
- “testuser的”用户ID和密码“test123”设置用来访问TESTDB。
- Python模块MySQLdb在你的机器上正确安装.
你已通过MySQL的教程,了解MySQL基础
例子:
以下是连接MySQL数据库“TESTDB”例子
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.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()
而在我的Linux机器运行此脚本,其产生的结果如下.
Database version : 5.0.45
如果连接建立的数据源,然后返回一个Connection对象,并保存成数据库,为进一步利用,否则DB设置为None。下一步db对象是用来创建一个游标对象,而这又是用来执行SQL查询.
最后出来之前,它确保数据库连接被关闭,资源被释放.
创建数据库表:
一旦建立一个数据库连接,我们已经准备好创建表或记录到数据库中使用表创建的游标的执行方法.
例子:
首先,让我们创建数据库表Employee:
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.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/python
import MySQLdb
# Open database connection
db = MySQLdb.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)
# 获取自增ID conn.insert_id()
# 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/python
import MySQLdb
# Open database connection
db = MySQLdb.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))
..................................
读取操作:
任何databasse读取运作手段从数据库中获取一些有用的信息.
我们的数据库建立连接后,我们准备进入这个数据库查询。我们可以使用fetchone()方法来获取单个记录或者fetchAll方法fetech从数据库表的多个值.
fetchone(): 这种方法获取查询结果集的下一行。结果集是一个对象时,将返回一个游标对象用于查询表.
fetchall(): 这种方法获取结果集的所有行。如果某些行已经从结果集中提取,fetchAll()方法检索结果集的其余行.
rowcount: 这是一个只读属性,返回受影响的行数execute()方法.
例子:
以下是程序查询雇员年薪超过1000表的所有记录.
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.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 fecth data"
# disconnect from server
db.close()
这将产生以下结果:
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
更新操作:
对任何数据库更新操作意味着更新已经可以在数据库中的一个或多个记录。以下是更新所有的记录为“M”SEX的过程。在这里,我们将所有男性年龄增加一年.
例子:
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.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操作是必需的,当你想从数据库中删除一些记录。以下是程序删除雇员的所有记录,其中年龄超过20岁.
例子:
#!/usr/bin/python
import MySQLdb
# Open database connection
db = MySQLdb.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()方法关闭,任何未完成的事务都将回滚数据库。然而,您的应用程序,而不是取决于任何DB的低层次的实现细节上,将更好地调用commit或显式使用rollback.
错误处理:
有许多错误的来源。举几个例子是在执行SQL语句的语法错误,连接失败,或已经取消或完成的语句句柄调用获取方法.
DB API定义了一些错误,必须存在于每个数据库模块。下表列出了这些异常.
| Exception | Description |
|---|---|
| Warning | Used for non-fatal issues. Must |
| subclass | StandardError. |
| Error | Base class for errors. Must subclass StandardError. |
| InterfaceError | Used for errors in the database module, not the database itself. Must subclass Error. |
| DatabaseError | Used for errors in the database. Must subclass Error. |
| DataError | Subclass of DatabaseError that refers to errors in the data. |
| 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. |
| IntegrityError | Subclass of DatabaseError for situations that would damage the relational integrity, such as uniqueness constraints or foreign keys. |
| InternalError | Subclass of DatabaseError that refers to errors internal to the database module, such as a cursor no longer being active. |
| ProgrammingError | Subclass of DatabaseError that refers to errors such as a bad table name and other things that can safely be blamed on you. |
| NotSupportedError | Subclass of DatabaseError that refers to trying to call unsupported functionality. |
你的Python脚本应该处理这些错误,但在使用上述任何例外之前,确保您的MySQLdb的支持该异常。你可以得到更多关于他们的信息,通过阅读DB API 2.0规范.
以下来自:https://www.cnblogs.com/franknihao/p/7267182.html
积累
● 关于使用MySQLdb获取到的数据的类型不符合预期的问题
今天碰到了一个问题。从数据库中通过MySQLdb获取到了一些数据是诸如这样的((u’01’,8L,Decimal(900.00)),)。可以看到MySQLdb取数据的时候对于相应的MySQL中的数据类型会被转换成类似的Python中的类型。但是有时候我们不想要那么repr地表示,比如这一行数据我就只想让它是’01’,8,900.0这些比较基本的Python中的类型而不是unicode,long,float这些。
一种办法是在取得数据之后进行一些数据的清洗。找到的另一种办法是将建立连接时的convertor改变。
MySQLdb在建立和MySQL之间的连接的时候,会声明好数据库数据类型和Python数据类型的对应关系。这部分信息被维护在了MySQLdb.convertors.conversions这个字典里。重点关注这个字典的中间部分有一些类似于FIELD_TYPE.XXX: xxx的键值对。键值其实是一个常量,后者是Python中的一个类型。这个字典就是会在MySQLdb.connect方法被执行时作为一个参数传递进来,并凭借里面的信息来对应类型的。
所以如果我们想把默认从数据库中取出来的Decimal换成float,8L换成int的8,就可以这么高:
from MySQLdb import convertors
conv = convertors.conversions.copy()
conv[246] = float # 246对应FIELD_TYPE.NEWDECIMAL,在convertors.py的代码中,如果from decimal import Decimal没有出错那么这个类型的数据最终返回Decimal,现在改成了float
conv[3] = int
conv[4] = int
# 3和4分别对应Long和LongLong数据,都改成int了
conn = MySQLdb.connect(host='xxxx',user='xxx',passwd='xxx',db='xxx',charset='xxx',conv=conv)
# 将参数conv设置为我们修改过的字典,之后再进行常规操作即可