您的位置:首页 > 数据库 > MySQL

Mysql Cookbook学习笔记第二章

2014-04-29 22:27 363 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: