#168 Python-MySQLdb 教程

Python操作MySQL,一个常用的方案就是使用MySQLdb库,安装在之前的日志已经介绍过了: Mac下新安装的MySQL无法登陆root用户解决方法

下面我们来看看如何使用Python操作MySQL,基本逻辑分为四个步骤。

包含MySQLdb库

1
import MySQLdb

与MySQL建立连接

1
conn = MySQLdb.connet(host='localhost', user='root';, passwd='root", db = 'euryugasaki', port=3306)

connect()方法用来提供与MySQL的连接,接受多个参数,返回连接的对象: host: 数据库主机名,默认是本地主机 user: 数据库登录用户,默认是当前用户 passwd: 数据库登录密码,默认是空 db: 使用的数据库名,没有默认值 port: MySQL服务使用TCP端口,默认3306

连接对象提供了对事务操作的支持,标准方法有: commit() 提交 插入更新数据的时候一定要执行commit()否则不能真正的插入数据。 rollback() 回滚

运行SQL语句并接受返回值

1
2
cursor = conn.cursor()
n = cursor.execute(sql,param)

我们需要使用连接返回的对象获得一个cursor对象,并使用cursor提供的方法来进行工作。这类方法包括两大类: a) 执行命令 callproc(self, procname, args): 用来执行存储过程,接受的参数为存储过程名和参数列表,返回值为受影响的行数. execute(self, query, args): 执行单条SQL语句,接受的参数为SQL语句本身和使用的参数列表,返回值为受影响的行数. executemany(self, query, args): 执行单条SQL语句,但是重复执行参数列表里的参数,返回值为受影响的行数. nextset(self): 移动到下一个结果集 b) 接受返回值 fetchall(self):接受全部的返回结果行. fetchmany(self, size=None): 接受size调返回结果行,如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据 fetchone(self): 返回一条结果航 scroll(self, value, mode='relative'): 移动指针到某一行,如果mode='relative',则表示当前所在行移动value条,如果mode='absolute',则表示从结果集的一行移动value条

关闭数据库连接

需要分别关闭指针对象和连接对象,他们有名字相同的方法:

1
2
cursor.close()
conn.close()

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import MySQLdb

try:
connection = MySQLdb.connect(host='localhost', user='root', passwd='cvlabock', db = 'euryugasaki', port=3306)
cur = connection.cursor()
count = cur.execute('SELECT * FROM wp_users')

#only accept one return value
result = cur.fetchone()
print result

#accept five return values
results = cur.fetchmany(5)
for r in results:
print r
print "\n"

#accept all the return values
result2 = cur.fetchall()
print result2

#insert datas
cur.execute('CREATE DATABASE IF NOT EXISTS testEuryugasaki')
conn.select_db('testEuryugasaki')
cur.execute('CREATE TABLE test(id int, info varchar(20))')
value=[1, 'hi Longqi']
cur.execute('INSERT INTO testEuryugasaki VALUES(%s, %s)', value)
values=[]
for i in range(20):
values.append((i, 'hi Longqi '+str(i)))
cur.excutemany('INSERT INTO testEueyugasaki VALUES(%s, %s)', values)
cur.execute('UPDATE testEuryugasaki SET info="I am Euryugasaki" WHERE id = 3')

conn.commit()

cur.close()
connection.close()

except MySQLdb.Error, e:
print "MySQL Error %d: %s" % (e.args[0], e.args[1])

connet()方法中还有一个参数是charset,设置charset是让数据库的编码与自身相同,如果数据库的编码是gb2312,则使用charset='gb2312',如果是utf-8则charset='urt8'

打赏催更