mysql是一个优秀的开源数据库,它现在的应用非常的广泛,因此很有必要简单的介绍一下用python操作mysql数据库的方法。python操作MySQL数据库需要安装一个第三方的模块,在http://mysql-python.sourceforge.net/有下载和文档。或者在本站下载:Python2.7+mysqldb win32 py2.7,下载后解压并直接默认安装即可。OK,如果你顺利安装完毕,你就可以使用Python访问MySQL数据库了。
这里先看一下使用的示例
# -*- coding: utf-8 -*-
import os, sys, string
import MySQLdb
# 连接数据库
try:
conn = MySQLdb.connect(host='localhost',user='root',passwd='123456',db='test')
except Exception, e:
print e
sys.exit()
# 获取cursor对象来进行操作
cursor = conn.cursor()
# 创建表
sql = "create table if not exists test1(name varchar(128) primary key, age int(4))"
cursor.execute(sql)
# 插入数据
sql = "insert into test1(name, age) values ('%s', %d)" % ("zhaowei", 23)
try:
cursor.execute(sql)
except Exception, e:
print e
sql = "insert into test1(name, age) values ('%s', %d)" % ("张三", 21)
try:
cursor.execute(sql)
except Exception, e:
print e
# 插入多条
sql = "insert into test1(name, age) values (%s, %s)"
val = (("李四", 24), ("王五", 25), ("洪六", 26))
try:
cursor.executemany(sql, val)
except Exception, e:
print e
#查询出数据
sql = "select * from test1"
cursor.execute(sql)
alldata = cursor.fetchall()
# 如果有数据返回,就循环输出, alldata是有个二维的列表
if alldata:
for rec in alldata:
print rec[0], rec[1]
cursor.close()
conn.close()
如果你的MySQL采用的是UTF-8编码,那么你在测试上面代码的时候,比如我是用下面的代码:
# -*- coding: utf-8 -*-
import os, sys, string
import MySQLdb
# 连接数据库
try:
conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',db='test')
except Exception, e:
print e
sys.exit()
# 获取cursor对象来进行操作
cursor = conn.cursor()
#查询出数据
sql = "select * from 203_class"
cursor.execute(sql)
alldata = cursor.fetchall()
# 如果有数据返回,就循环输出, alldata是有个二维的列表
if alldata:
for rec in alldata:
print rec[0], rec[1]
cursor.close()
conn.close()
如果你从数据库中取出的值包含中文,那么你看到的将是“?”,如下图所示:
一步步解决
出现乱码,我首先考虑到使用:set names 'UTF8'
于是我在获取cursor对象之后增加下面语句:
sql = "set names 'UTF8'"
cursor.execute(sql)
执行的结果仍是乱码,如下图所示:
奇怪?问题出在哪?
由于数据库是我自己的一个项目正使用的数据库,通过PHP操作从未出现过乱码现象。(附:MySQL终极配置解决UTF8编码出现的乱码问题)不会是数据库的问题。重点还是放到Python的代码上。后来在测试连接数据库这块加上charset属性,如下:
conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',db='test',charset='UTF8')
解决乱码问题,如下图所示:
接着,我去掉 set names 'UTF8' 语句,最终代码如下所示
# -*- coding: utf-8 -*-
import os, sys, string
import MySQLdb
# 连接数据库
try:
conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',db='test',charset='UTF8')
except Exception, e:
print e
sys.exit()
# 获取cursor对象来进行操作
cursor = conn.cursor()
#查询出数据
sql = "select * from 203_class"
cursor.execute(sql)
alldata = cursor.fetchall()
# 如果有数据返回,就循环输出, alldata是有个二维的列表
if alldata:
for rec in alldata:
print rec[0], rec[1]
cursor.close()
conn.close()
取出的数据正常显示,未出现乱码现象。
另外,如果在连接数据库时不指定UTF8编码。采用 cursor.execute("set names 'GBK'") 方式,如下面代码所示
# -*- coding: utf-8 -*-
import os, sys, string
import MySQLdb
# 连接数据库
try:
conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',db='test')
except Exception, e:
print e
sys.exit()
# 获取cursor对象来进行操作
cursor = conn.cursor()
sql = "set names 'GBK'"
cursor.execute(sql)
#查询出数据
sql = "select * from 203_class"
cursor.execute(sql)
alldata = cursor.fetchall()
# 如果有数据返回,就循环输出, alldata是有个二维的列表
if alldata:
for rec in alldata:
print rec[0], rec[1]
cursor.close()
conn.close()
也能正确显示汉字,不出现乱码问题。不过我总感觉这有些别扭。所以,解决MySQL为utf8编码的情况下出现乱码问题,有下面两种解决办法:
1、在连接数据库代码中利用charset属性指定为utf8编码
2、利用cursor.execute("set names 'GBK'") 方式指定
剩下的事情,就是你自己的决定了。
等一下,现在不要急做决定,先认真看完这一篇文章:python 中文乱码问题深入分析,对Python中出现的乱码问题就有一个更好的理解。本篇内容只是解决了问题,而未探究问题的根源。这也就是为什么上面我所说的“感觉有些别扭”。在下面的代码中,利用“Python中文乱码问题深入分析”这篇文章的知识,解决乱码问题:
# -*- coding: utf-8 -*-
import os, sys, string
import MySQLdb
import codecs
# 连接数据库
try:
conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='123456',db='dj480')
except Exception, e:
print e
sys.exit()
# 获取cursor对象来进行操作
cursor = conn.cursor()
cursor.execute("set names 'UTF8'")
#查询出数据
sql = "select * from 203_class"
cursor.execute(sql)
alldata = cursor.fetchall()
# 如果有数据返回,就循环输出, alldata是有个二维的列表
if alldata:
for rec in alldata:
print rec[0], rec[1].decode("utf-8")
cursor.close()
conn.close()
上面的代码中,由于rec[0]的值为数字,所以,如果你写成:rec[0].decode("utf-8"),那么会返回如下错误:
将数字转换为字符串即可。
接下来,我得忙别的事了,如果这篇文章有遗漏或缺陷的地方,以后抽空在补充。并且继续完善。目前解决问题的方法仅做参考。欢迎交流和相互学习。