Mysql Cookbook学习笔记第二章

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"

例如:使用错误的密码:

image

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

posted @ 2014-04-29 22:27  小石头@shu  阅读(199)  评论(0编辑  收藏  举报