全部博文(2065)
分类: Python/Ruby
2010-01-13 10:49:59
python操作MySQL专题
[整理人:hkebao#126.com 整理时间:
一、安装MySQLDb 包及验证
安装篇略过
验证:只需要在命令行输入import MySQLdb 没报错就说明成功配置
二、详细的API说明帮助及心得体会
2.1 连接对象的属性及方法
我们现在只是介绍常用到的参数项。请看
conn = MySQLdb.connect("localhost","root","321","test",port=3306,connect_timeout=10,compress=True,charset='utf8',use_unicode=True)
所列举的项分别是:
Host 连接到的主机名
User 登录用户名
Passwd 密码
Db 数据库名称
Port 端口
这五项应当讲是必需的也是非常常用的。
Connect_timeout 表示连接超时时间 这个在实际应用中最好配置一下以防止数据库堵塞
Use_unicode 如果设置为true表示全部的char、varchar、text列返回为unicode字符串。最好是设置成服务器的默认编码的。(待测试)
Charset 设置连接的编码
(如果遇到中文乱码的时候可以考虑使用这两个参数设置)
再看这个连接对象的相关方法
依次为:
Commit() 如果数据库支持事务处理这个方法就表示提交当前的事务。否则啥都不做
Rollback() 回滚当前事务
Cursor([cursorclass]) 游标对象
以上简单介绍了有关连接对象的属性及方法。其实与MSSQL模块是一样的!
2.2 Cursor对象
对象常用方法
Callproc(procname,args)
调用存储过程对MYSQL而言只有到了5.0以后才有支持存储过程的!
Close()
关闭游标。如果你是创建服务器端的游标的话就一定要记得关闭掉!
PS:游标简介
服务器端游标好. 在客户端游标中,默认结果集用于将整个结果集高速缓存在客户端上,
所有的游标操作都在此客户端高速缓存中执行。不使用SQL Server2000 的任何一个服务器游标功能。
客户端游标仅支持只进和静态游标,不支持键集驱动游标和动态游标。
客户端游标应只用于减少由于服务器游标不支持所有的 Transact-SQL 语句或批处理所带来的限制。
如果需要在不能用服务器游标执行的 Transact-SQL 语句或批处理上使用静态的滚动游标,
则可以考虑使用客户端游标。
在ASP的ADO编程中就经常会有这样的出现。以前在DELPHI中也经常遇到这样的事情!
2.3 介绍常用的API操作之更新操作
Execute(self,query,args)
执行一条query语句
示例:
import MySQLdb
conn = MySQLdb.connect("localhost","root","321","test",port=3306,connect_timeout=10,compress=True,charset='utf8',use_unicode=True)
cursor=conn.cursor()
cursor.execute("insert into t(name) values('a')")#一条SQL语句
conn.commit()
cursor.close()
conn.close()
示例二:将参数单独写出来
import MySQLdb
conn = MySQLdb.connect("localhost","root","321","test",port=3306,connect_timeout=10,compress=True,charset='utf8',use_unicode=True)
cursor=conn.cursor()
cursor.execute("insert into t(name) values(%s)",\
('john')) #与MSSQL的操作是不是一样的哈哈
conn.commit()
cursor.close()
conn.close()
如果想将事务也带进来的话我们可以这样写
try:
cursor.execute("insert into t(name) values(%s)",\
('john'))
conn.commit()
except:
conn.rollback()
executemany
(self, query, args) 表示一次执行多个语句相当于MSSQL中的操作是一样的
示例:
try:
cursor.executemany("insert into t(name) values(%s)",\
[('john'),('bool')]) #一次提交多条插入语句到数据库
conn.commit() #提交
except:
conn.rollback()
PS:这些操作与MSSQL操作是一样的!
2.4 介绍常用的API操作之查询操作
PS:返回查询的结果集
Fetchall(self) : 表示从当前的游标中返回全部的记录集
示例:
import MySQLdb
conn = MySQLdb.connect("localhost","root","321","test",port=3306,connect_timeout=10,compress=True,charset='utf8',use_unicode=True)
cursor=conn.cursor()
cursor.execute("select * from t")
row = cursor.fetchall() #与MSSQL的操作是一样的也是全部提取记录集
for i in
range(len(row)):
print row[i][0]
cursor.close()
conn.close()
fetchmany(self, size=None) 返回指定的记录集
示例:
cursor.execute("select * from t")
row = cursor.fetchmany(3) #表示只返回三条记录回来
for i in range(len(row)):
print row[i][0]
fetchone(self) 返回一条记录 应用范围可以用到select * from table where id=1
cursor.execute("select * from t where id=4")
row = cursor.fetchone() #返回一条记录
print row[0]
starttime = time.clock()
conn = MySQLdb.connect("127.0.0.1","test","test","test",port=3306,connect_timeout=10,compress=True,charset='utf8',use_unicode=True)
cursor=conn.cursor()
try:
for i in xrange(0,50000):
cursor.execute(" insert into t(json) values('a')") #数据库里面没有数据
cursor.execute("delete from a limit 25000") #再来一个新事务!然后再一次性commit掉即可
conn.commit() #一次批量提交50000条记录
except Exception,e:
print str(e)
cursor.close()
conn.close()
endtime = time.clock()
print (endtime-starttime)
chinaunix网友2010-07-19 16:05:54
一篇介绍的文章整理如下: 这样的操作的好处就是把多个事务一次性提交。大大地减小了磁盘的IO。将多个操作封装成一个事务然后批量update到数据表。
hkebao2010-07-18 23:38:16
补充实现:如何实现所谓地批量提交的功能而不是每更新一条记录就提交一次而是一次性更新多条之后再提交的。测试结果让我非常吃惊呀。我就说嘛怎么更新几十万的记录要这么久的时间的。 try: for i in xrange(0,10000): cursor.execute(" insert into syslog.a(a) select a from test.a limit 1") conn.commit() except Exception,e: print str(e) 批量提交速度非常快。单个提交 try: for i in xrange(0,10000): cursor.execute(" insert into syslog.b(a) select a from test.a limit 1") conn.commit() except Exception,e: print str(e)
hkebao2010-07-17 21:53:42
连接到数据库之后如何操作两个不同DB的表呢? conn = MySQLdb.connect("127.0.0.1","test","test","test",port=3306,connect_timeout=10,compress=True,charset='utf8',use_unicode=True) cursor=conn.cursor() try: cursor.execute(" insert into syslog.a(a) select a from test.a limit 1") conn.commit() except Exception,e: print str(e)