1,使用python链接mysql
# -*- coding: utf-8 -*-
# connect.py --连接到MySQL服务器
import sys
import MySQLdb
try:
conn = MySQLdb.connect(db = "cookbook",
host = "localhost",
user = "burness",
passwd = "123456")
print "Connected"
except:
print "Cannot connect to server"
sys.exit(1)
conn.close()
print "Disconnected"
2,使用python操作过程中提示出错信息以便于调试
# -*- coding: utf-8 -*-
# connect.py --连接到MySQL服务器
import sys
import MySQLdb
try:
conn = MySQLdb.connect(db = "cookbook",
host = "localhost",
user = "burness",
passwd = "123456")
print "Connected"
except MySQLdb.Error, e:
print "Cannot connect to server"
print "Error code:", e.args[0]
print "Error message:", e.args[1]
sys.exit(1)
conn.close()
print "Disconnected"
例如:使用错误的密码:
3,编写库文件
库文件可以简化在程序中频繁使用配置参数,以及保证一些数据的隐秘性如密码
例如 Cookbook.py内保存有数据库连接的内容:
# -*- coding: utf-8 -*-
# Cookbook.py -具有通过MySQLdb模块连接MySQL的工具方法的库文件
import MySQLdb
host_name="localhost"
db_name="cookbook"
user_name="burness"
password="123456"
# 建立一个到cookbook数据库的连接,返回一个connection对象
# 如果不能建立连接则抛出一个异常。
def connect():
return MySQLdb.connect(db=db_name,
host=host_name,
user=user_name,
passwd=password)
harness.py 测试Cookbook.py
import sys
import MySQLdb
import Cookbook
# 用来测试Cookbook.py
try:
conn=Cookbook.connect()
print "Connected"
except MySQLdb.Error, e:
print "Cannot connect to serve"
print "Error code:",e.args[0]
print "Error message:",e.args[1]
sys.exit(1)
conn.close()
print "Disconnected"
4,发起语句并检索结果
python 中MySQLdb使用cursor来进行execute的操作,不返回结果如update:
expand sourceview source
print?·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
01.import sys
02.import MySQLdb
03.import Cookbook
04.# 用来测试Cookbook.py
05.try:
06. conn=Cookbook.connect()
07. print "Connected"
08.except MySQLdb.Error, e:
09. print "Cannot connect to serve"
10. print "Error code:",e.args[0]
11. print "Error message:",e.args[1]
12. sys.exit(1)
13.# cursor=conn.cursor()
14.# 使用行作为命名元素
15.cursor = conn.cursor(MySQLdb.cursors.DictCursor)
16.cursor.execute("select id, name, cats from profile")
17.rows=cursor.fetchall()
18.#for row in rows:
19.# print "id:%s, name: %s, cats: %s" % (row[0],row[1],row[2])
20.for row in rows:
21. print "id:%s, name: %s, cats: %s" % (row["id"],row["name"],row["cats"])
22.print "Number of rows returned: %d" % cursor.rowcount
23.conn.close()
24.print "Disconnected"
返回结果,如select
import sys
import MySQLdb
import Cookbook
# 用来测试Cookbook.py
try:
conn=Cookbook.connect()
print "Connected"
except MySQLdb.Error, e:
print "Cannot connect to serve"
print "Error code:",e.args[0]
print "Error message:",e.args[1]
sys.exit(1)
cursor=conn.cursor()
cursor.execute("select id, name, cats from profile")
while 1:
row=cursor.fetchone()# fetchone用来顺序返回下一行
if row==None:
break
print "id: %s, name: %s, cats: %s" %(row[0],row[1],row[2])
print "Number of rows returned: %d" % cursor.rowcount
conn.close()
print "Disconnected"
使用fetchall()可以一次返回整个满足条件的结果集
import sys
import MySQLdb
import Cookbook
# 用来测试Cookbook.py
try:
conn=Cookbook.connect()
print "Connected"
except MySQLdb.Error, e:
print "Cannot connect to serve"
print "Error code:",e.args[0]
print "Error message:",e.args[1]
sys.exit(1)
# cursor=conn.cursor()
# 使用行作为命名元素
cursor = conn.cursor(MySQLdb.cursors.DictCursor)
cursor.execute("select id, name, cats from profile")
rows=cursor.fetchall()
#for row in rows:
# print "id:%s, name: %s, cats: %s" % (row[0],row[1],row[2])
for row in rows:
print "id:%s, name: %s, cats: %s" % (row["id"],row["name"],row["cats"])
print "Number of rows returned: %d" % cursor.rowcount
conn.close()
print "Disconnected"
5,处理语句中的特殊字符和NULL值
占位符机制和引用:
python中可以使用格式化来进行占位符的使用
import sys
import MySQLdb
import Cookbook
# 用来测试Cookbook.py
try:
conn=Cookbook.connect()
print "Connected"
except MySQLdb.Error, e:
print "Cannot connect to serve"
print "Error code:",e.args[0]
print "Error message:",e.args[1]
sys.exit(1)
cursor = conn.cursor()
# 使用占位符来与mysql交互,python中支持格式化符号用来作为占位符
cursor.execute("""insert into profile (name,birth,color,foods,cats)values(%s,%s,%s,%s,%s)""",("De'Mont","1973-01-12",None,"eggroll",4))
print "Number of rows update: %d"%cursor.rowcount
cursor2=conn.cursor()
cursor2.execute("select * from profile")
rows=cursor2.fetchall()
for row in rows:
print "id:%s, name: %s, cats: %s" % (row[0],row[1],row[2])
print "Number of rows returned: %d" % cursor2.rowcount
conn.close()
print "Disconnected"
另外一个方法是MySQLdb引用时使用literal()方法
import sys
import MySQLdb
import Cookbook
# 用来测试Cookbook.py
try:
conn=Cookbook.connect()
print "Connected"
except MySQLdb.Error, e:
print "Cannot connect to serve"
print "Error code:",e.args[0]
print "Error message:",e.args[1]
sys.exit(1)
# cursor=conn.cursor()
# 使用行作为命名元素
cursor = conn.cursor()
# 使用占位符来与mysql交互,python中支持格式化符号用来作为占位符
cursor.execute("""insert into profile (name,birth,color,foods,cats)
values(%s,%s,%s,%s,%s)"""%(conn.literal("123123123123"),conn.literal("1973-01-12"),conn.literal("123"),conn.literal("eggroll"),conn.literal(4)))
conn.commit()# 必须要有这个才能提交,才会有保存
print "Number of rows update: %d"%cursor.rowcount
conn.close()
print "Disconnected"
在实验代码的过程中发现上一个运行后在本地mysql数据库中没有保存,google之后发现必须在完成之后运行conn.commit()才能使更改保存!!!
6,识别结果集中的NULL值
python程序使用None来表示结果集中的NULL,代码如下:
import sys
import MySQLdb
import Cookbook
# 用来测试Cookbook.py
try:
conn=Cookbook.connect()
print "Connected"
except MySQLdb.Error, e:
print "Cannot connect to serve"
print "Error code:",e.args[0]
print "Error message:",e.args[1]
sys.exit(1)
# cursor=conn.cursor()
# 使用行作为命名元素
cursor = conn.cursor()
# 使用占位符来与mysql交互,python中支持格式化符号用来作为占位符
cursor.execute("select name, birth, foods from profile")
for row in cursor.fetchall():
row=list(row)
for i in range(0,len(row)):
if row[i]==None:
row[i]="NULL"
print "name: %s, birth: %s, food: %s"%(row[0],row[1],row[2])
conn.close()
print "Disconnected"
7,获取连接参数的技术
a,将参数硬编码到程序中;b,交互式请求参数;c,从命令行获取参数;d,从执行环境获取参数;e,从一个独立的文件中获取参数
从命令行得到参数可以通过getopt.getopt,具体代码如下:
# -*- coding: cp936 -*-
#cmdline.py -- 说明Python中的命令行选项解析
import sys
import getopt
import MySQLdb
try:
opts, args=getopt.getopt(sys.argv[1:],"h:p:u:",["host=","password=","user="])# h: p: u: 表示后面都带参数 如是hp:则说明h不带参数
print opts
except getopt.error,e:
#对于错误,输出程序名以及错误信息文本
print "%s: %s" %(sys.argv[0],e)
sys.exit(1)
host_name=password=user_name=""
for opt,arg in opts:
if opt in ("-h","--host"):
host_name=arg
elif opt in ("-p","--password"):
password=arg
elif opt in ("-u","--user"):
user_name=arg
#所有剩下的非选项参数都保留在args中,并可在这里做必要的处理
try:
conn=MySQLdb.connect(db="cookbook",host=host_name,user=user_name,passwd=password)
print "Connected"
except MySQLdb.Error,e:
print "Cannot connect to server"
print "Error:",e.args[1]
print "Code:",e.args[0]
sys.exit(1)
conn.close()
print "Disconnected"
从选项文件获取参数
Unix下有/etc/my.cnf,mysql安装目录的my.cnf,以及当前用户的~/.my.cnf(按系统查找顺序来),当存在多个时,最后发现的具有最高优先级而在windows下安装目录my.ini,windows根目录my.ini或者my.cnf