python操作mysql

转自:http://www.cnblogs.com/rollenholt/archive/2012/05/29/2524327.html

坚持每天学一点,每天积累一点点,作为自己每天的业余收获,这个文章是我在吃饭的期间写的,利用自己零散的时间学了一下python操作MYSQL,所以整理一下。

我采用的是MySQLdb操作的MYSQL数据库。先来一个简单的例子吧:

?
1
2
3
4
5
6
7
8
9
10
import  MySQLdb
 
try :
     conn = MySQLdb.connect(host = 'localhost' ,user = 'root' ,passwd = 'root' ,db = 'test' ,port = 3306 )
     cur = conn.cursor()
     cur.execute( 'select * from user' )
     cur.close()
     conn.close()
except  MySQLdb.Error,e:
      print  "Mysql Error %d: %s"  %  (e.args[ 0 ], e.args[ 1 ])

  请注意修改你的数据库,主机名,用户名,密码。

下面来大致演示一下插入数据,批量插入数据,更新数据的例子吧:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import  MySQLdb
 
try :
     conn = MySQLdb.connect(host = 'localhost' ,user = 'root' ,passwd = 'root' ,port = 3306 )
     cur = conn.cursor()
     
     cur.execute( 'create database if not exists python' )
     conn.select_db( 'python' )
     cur.execute( 'create table test(id int,info varchar(20))' )
     
     value = [ 1 , 'hi rollen' ]
     cur.execute( 'insert into test values(%s,%s)' ,value)
     
     values = []
     for  i in  range ( 20 ):
         values.append((i, 'hi rollen' + str (i)))
         
     cur.executemany( 'insert into test values(%s,%s)' ,values)
 
     cur.execute( 'update test set info="I am rollen" where id=3' )
 
     conn.commit()
     cur.close()
     conn.close()
 
except  MySQLdb.Error,e:
      print  "Mysql Error %d: %s"  %  (e.args[ 0 ], e.args[ 1 ])

  请注意一定要有conn.commit()这句来提交事务要不然不能真正的插入数据。

运行之后我的MySQL数据库的结果就不上图了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import  MySQLdb
 
try :
     conn = MySQLdb.connect(host = 'localhost' ,user = 'root' ,passwd = 'root' ,port = 3306 )
     cur = conn.cursor()
     
     conn.select_db( 'python' )
 
     count = cur.execute( 'select * from test' )
     print  'there has %s rows record'  %  count
 
     result = cur.fetchone()
     print  result
     print  'ID: %s info %s'  %  result
 
     results = cur.fetchmany( 5 )
     for  r in  results:
         print  r
 
     print  '==' * 10
     cur.scroll( 0 ,mode = 'absolute' )
 
     results = cur.fetchall()
     for  r in  results:
         print  r[ 1 ]
     
 
     conn.commit()
     cur.close()
     conn.close()
 
except  MySQLdb.Error,e:
      print  "Mysql Error %d: %s"  %  (e.args[ 0 ], e.args[ 1 ])

  运行结果就不贴了,太长了。

查询后中文会正确显示,但在数据库中却是乱码的。经过我从网上查找,发现用一个属性有可搞定:

在Python代码 

conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='python') 中加一个属性:
 改为:
conn = MySQLdb.Connect(host='localhost', user='root', passwd='root', db='python',charset='utf8') 
charset是要跟你数据库的编码一样,如果是数据库是gb2312 ,则写charset='gb2312'。

 

下面贴一下常用的函数:

然后,这个连接对象也提供了对事务操作的支持,标准的方法
commit() 提交
rollback() 回滚

cursor用来执行命令的方法:
callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
nextset(self):移动到下一个结果集

cursor用来接收返回值的方法:
fetchall(self):接收全部的返回结果行.
fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
fetchone(self):返回一条结果行.
scroll(self, value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果 mode='absolute',则表示从结果集的第一行移动value条.

参考资料:

MySQLdb‘s user guide

package MySQLdb


http://sourceforge.net/projects/mysql-python0 && image.height<0){if(image.width<=700){this.width=700;this.height=image.height*700/image.width;}}" class=snap_preview_icon src="http://i.ixnp.com/images/v3.54.0.1/t.gif"<
如果你不确定你的python环境里有没有这个库,那就打开python shell,输入 import MySQLdb,如果返回错误信息,那就表示你的机器上没有,赶紧去下载一个.我的机器是win xp,所以我下载了win环境下的exe那个,直接双击完成安装.

在介绍具体的操作前,先花点时间来说说一个程序怎么和数据库进行交互
1.和数据库建立连接
2.执行sql语句,接收返回值
3.关闭数据库连接
使用MySQLdb也要遵循上面的几步.让我们一步步的进行.

[b]0.引入MySQLdb库[/b]
import MySQLdb

[b]1.和数据库建立连接[/b]
conn=MySQLdb.connect(host="localhost",user="root",passwd="sa",db="mytable")
提供的connect方法用来和数据库建立连接,接收数个参数,返回连接对象.

比较常用的参数包括
host:数据库主机名.默认是用本地主机.
user:数据库登陆名.默认是当前用户.
passwd:数据库登陆的秘密.默认为空.
db:要使用的数据库名.没有默认值.
port:MySQL服务使用的TCP端口.默认是3306.
更多关于参数的信息可以查这里
http://mysql-python.sourceforge.net/MySQLdb.html0 && image.height<0){if(image.width<=700){this.width=700;this.height=image.height*700/image.width;}}" class=snap_preview_icon src="http://i.ixnp.com/images/v3.54.0.1/t.gif"<

然后,这个连接对象也提供了对事务操作的支持,标准的方法
commit() 提交
rollback() 回滚

[b]2.执行sql语句和接收返回值[/b]
cursor=conn.cursor()
n=cursor.execute(sql,param)
首先,我们用使用连接对象获得一个cursor对象,接下来,我们会使用cursor提供的方法来进行工作.这些方法包括两大类:1.执行命令,2.接收返回值

cursor用来执行命令的方法:
callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
nextset(self):移动到下一个结果集

cursor用来接收返回值的方法:
fetchall(self):接收全部的返回结果行.
fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
fetchone(self):返回一条结果行.
scroll(self, value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果 mode='absolute',则表示从结果集的第一行移动value条.

下面的代码是一个完整的例子.
#使用sql语句,这里要接收的参数都用%s占位符.要注意的是,无论你要插入的数据是什么类型,占位符永远都要用%s
sql="insert into cdinfo values(%s,%s,%s,%s,%s)"
#param应该为tuple或者list
param=(title,singer,imgurl,url,alpha)
#执行,如果成功,n的值为1
n=cursor.execute(sql,param)

#再来执行一个查询的操作
cursor.execute("select * from cdinfo")
#我们使用了fetchall这个方法.这样,cds里保存的将会是查询返回的全部结果.每条结果都是一个tuple类型的数据,这些tuple组成了一个tuple
cds=cursor.fetchall()
#因为是tuple,所以可以这样使用结果集
print cds[0][3]
#或者直接显示出来,看看结果集的真实样子
print cds

#如果需要批量的插入数据,就这样做
sql="insert into cdinfo values(0,%s,%s,%s,%s,%s)"
#每个值的集合为一个tuple,整个参数集组成一个tuple,或者list
param=((title,singer,imgurl,url,alpha),(title2,singer2,imgurl2,url2,alpha2))
#使用executemany方法来批量的插入数据.这真是一个很酷的方法!
n=cursor.executemany(sql,param)

需要注意的是(或者说是我感到奇怪的是),在执行完插入或删除或修改操作后,需要调用一下conn.commit()方法进行提交.这样,数据才会真正保 存在数据库中.我不清楚是否是我的mysql设置问题,总之,今天我在一开始使用的时候,如果不用commit,那数据就不会保留在数据库中,但是,数据 确实在数据库呆过.因为自动编号进行了累积,而且返回的受影响的行数并不为0.

[b]3.关闭数据库连接[/b]
需要分别的关闭指针对象和连接对象.他们有名字相同的方法
cursor.close()
conn.close()

三步完成,基本的数据库操作就是这样了.下面是两个有用的连接
MySQLdb用户指南: http://mysql-python.sourceforge.net/MySQLdb.html0 && image.height<0){if(image.width<=700){this.width=700;this.height=image.height*700/image.width;}}" class=snap_preview_icon src="http://i.ixnp.com/images/v3.54.0.1/t.gif"<
MySQLdb文档: http://mysql-python.sourceforge.net/MySQLdb-1.2.2/public/MySQLdb-module.html0 && image.height<0){if(image.width<=700){this.width=700;this.height=image.height*700/image.width;}}" class=snap_preview_icon src="http://i.ixnp.com/images/v3.54.0.1/t.gif"<


转自:http://hi.baidu.com/jetqu2003/item/9ca22c3d78a5b30bceb9fea4

Python操作MYSQL大全

1。在http://sourceforge.net/projects/mysql-python/下载,连接所需要的包,MysqlDB。最新的版本是1.2.1_p2(for *NIX)或者1.2.0(for i386),我用的是i386版的,以下都以1.2.0为例。

2。下载后安装,会自动找到你Python的安装目录,装在%Python_HOME%Libsite-packages目录中。

3。代码实例

  1. from MySQLdb import *
  2. def conn():
  3. cn=Connection('127.0.0.1','root','','test')
  4. #Connection()函数的参数依次为
  5. #    host(string, host to connect);
  6. #    user(string, user to connect as);
  7. #    passwd(string, password to use);
  8. #    db(string, database to use)
  9. #也可以这样选择数据库
  10. #cn.select_db('test')
  11. cur=cn.cursor()
  12. cur.execute('select * from user')
  13. #设置游标的位置,不设置默认为0
  14. #cur.scroll(0)
  15. row=cur.fetchone()
  16. #查询游标位置的一条记录,返回值为元组
  17. print row[0] #输出第一个字段内容
  18. print row[1]
  19. if __name__=='__main__':
  20. conn()

4。查询时也可执行fetchall(),返回所有记录为一个元组(tuple),元组的每个元素为每行记录;还有fetchmany(size)

5。增删改的例子
insert:

cur.execute('insert into user (name,passwd) values('sparezgw','asdfasdf')')
cur.insert_id()

update:

cur.execute('update user set passwd='asdfasdf'  where name='sparezgw'')

delete:

cur.execute('delete from user where id=2')

------------------------------------------------------------------------------------------------------

MySQL-Python -- MySQL 的 Python 接口 2006年07月29日 星期六 上午 00:16

The Python Database API (DBAPI) 2.0 http://wiki.woodpecker.org.cn/moin/PyDBAPI2 MySQL 的 Python 接口 http://sourceforge.net/projects/mysql-python import MySQLdb
# connect
db = MySQLdb.connect(host="localhost", user="joe", passwd="secret",db="db56a")
# create a cursor
cursor = db.cursor()
# execute SQL statement
cursor.execute("SELECT * FROM animals") # One By One 
# get the number of rows in the resultset
numrows = int(cursor.rowcount)
# get and display one row at a time
for x in range(0,numrows):
row = cursor.fetchone()
print row[0], "-->", row[1] # limit the resultset to 3 items
result = cursor.fetchmany(3)
# iterate through resultset
for record in result:
print record[0] , "-->", record[1] # get the resultset as a tuple
result = cursor.fetchall()
# iterate through resultset
for record in result:
print record[0] , "-->", record[1] # import MySQL module
import MySQLdb
# get user input
name = raw_input("Please enter a name: ")
species = raw_input("Please enter a species: ")
# connect
db = MySQLdb.connect(host="localhost", user="joe", passwd="secret",db="db56a")
# create a cursor
cursor = db.cursor()
# execute SQL statement
cursor.execute("INSERT INTO animals (name, species) VALUES (%s, %s)",(name, species)) 
# import MySQL module
import MySQLdb
# connect
db = MySQLdb.connect(host="localhost", user="joe", passwd="secret",db="db56a")
# create a cursor
cursor = db.cursor()
# execute SQL statement
cursor.execute("""INSERT INTO test (field1, field2) VALUES ("val1","val2")""")
# get ID of last inserted record
print "ID of inserted record is ", int(cursor.insert_id()) 
# import MySQL module
import MySQLdb
# connect
db = MySQLdb.connect(host="localhost", user="joe", passwd="secret",db="db56a")
# create a cursor
cursor = db.cursor()
# dynamically generate SQL statements from list
cursor.executemany("INSERT INTO animals (name, species) VALUES (%s,%s)", [('Rollo', 'Rat'), ('Dudley', 'Dolphin'), ('Mark', 'Marmoset')])

# import MySQL module
import MySQLdb
# initialize some variables
name = ""
data = []
# loop and ask for user input
while (1):
name = raw_input("Please enter a name (EOF to end): ")
if name == "EOF":
break
species = raw_input("Please enter a species: ")
# put user input into a tuple
tuple = (name, species)
# and append to data[] list
data.append(tuple)
# connect
db = MySQLdb.connect(host="localhost", user="joe", passwd="secret",db="db56a")
# create a cursor
cursor = db.cursor()
# dynamically generate SQL statements from data[] list
cursor.executemany("INSERT INTO animals (name, species) VALUES (%s,%s)",data)

------------------------------------------------------------------------------------------------------

python连接mysql数据库 2008-08-22 17:59

看自己的机器有没有python

[root@localhost zn]#python -v           //会进入python

Python 2.4.3 (#1, Dec 11 2006, 11:38:52) 
[GCC 4.1.1 20061130 (Red Hat 4.1.1-43)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>                                                         //想要退出python 按键Ctrl+D

pythontest。py文件内容

#!/usr/bin/python
# imoprt MySQL module
import MySQLdb
#connect to the database
db=MySQLdb.connect(host="127.0.0.1",user="root",passwd="666666",db="cityman")
#get a cursor 
cursor=db.cursor()
#sql statement
cursor.execute("insert into person values('','wangzhi','25','male')")
cursor.execute("select * from person")
#get the result set
result=cursor.fetchall()
#iterate thtough the result set
for i in result:
print(i) 
cursor.close

回到终端

[root@localhost zn]# python python2mysql.py
python2mysql.py:9: Warning: Out of range value adjusted for column 'id' at row 1
cursor.execute("insert into person values('','wangzhi','25','male')")
(1L, 'liujun', 28L, 'male')
(2L, 'shenyang', 22L, 'fmale')
(3L, 'lizhiwei', 32L, 'male')
(4L, 'wangzhi', 25L, 'male')

执行成功

perl和python非常相像,这是我见过的最简练的两种语言,真的很棒。

----------------------------------------------------------------------------------------------------------------------

python操作mysql 2008-07-08 07:49

#!/usr/bin/env python
# -*-coding:UTF-8-*-#这一句告诉python用UTF-8编码
#=========================================================================
#
# NAME: Python MySQL test
#
# AUTHOR: benyur
# DATE : 2004-12-28
#
# COMMENT: 这是一个python连接mysql的例子
#
#=========================================================================

"""
***** This is a MySQL test *****

select:
   conn=Connection()
   conn.select_db('test')
   cur=conn.cursor()
   cur.execute('select * from user')
   cur.scroll(0)
   row1=cur.fetchone()
   row1[0]
   row1[1]
   row1[2]
  
insert:
   cur.execute('insert into user (name,passwd) values(\'benyur\',\'12345\')')
   cur.insert_id()
  
update:
   cur.execute('update user set passwd=\'123456\' where name=\'benyur\'')
  
delete:
   cur.execute('delete from user where id=2')

**********************************
"""


from MySQLdb import *


def conn():
conn=Connection()
conn.select_db('test')
cur=conn.cursor()
cur.execute('select * from user')
cur.scroll(0)
row1=cur.fetchone()
row1[0]
row1[1]
row1[2]


def usage():
print __doc__


if __name__=='__main__':
usage()



MySQLdb下载地址: http://sourceforge.net/projects/mysql-python/
下载解压缩后放到%Python_HOME%\Lib\site-packages目录中,python会自动找到此包。
MySQLdb基本上是MySQL C API的Python版,遵循Python Database API Specification v2.0。

其他:

1.    平台及版本
linux 内核2.6,gcc 3.4.4,glibc 2.4
python 2.4.3
mysql 5.0.19
mysql-python 1.2.1-p2
2.    安装mysql-python
tar xvfz MySQL-python-1.2.1_p2.tar.gz
cd MySQL-python-1.2.1_p2
python setup.py build
python setup.py install

3.    使用
import MySQLdb
3.1.    连接
conn =    MySQLdb.Connection(host, user, password, dbname)
3.2.    选择数据库
conn.select_db(’database name’)
3.3.    获得cursor
cur =    conn.cursor()
3.4.    cursor位置设定
cur.scroll(int, mode)
mode可为相对位置或者绝对位置,分别为relative和absolute。


3.5.    select
cur.execute(‘select clause’)
例如
cur.execute(‘select * from mytable’)


row = cur.fetchall()
或者:
row1 = cur.fetchone()
3.6.    insert
cur.execute(‘inset clause’)
例如
cur.execute(‘insert into table (row1, row2) values (\’111\’, \’222\’)’)


conn.commit()


3.7.    update
cur.execute(‘update clause’)
例如
cur.execute(“update table set row1 = ‘’ where row2 = ‘row2 ‘ ”)


conn.commit()


3.8.    delete
cur.execute(‘delete clause’)
例如
cur.execute(“delete from table where row1 = ‘row1’ ”)


conn.commit()


4.    心得

------------------------------------------------------------------------------------------------

Python mysql 中文乱码 2007年09月05日 星期三 21:48 import MySQLdb
db_user = "tiger"
db_pw = "tiger"
db = MySQLdb.connect(host="localhost", user=db_user, passwd=db_pw ,db="finaltldw",charset="gb2312")
c = db.cursor()
c.execute("""select id, name from NODES""")
i=0;
for id, name in c.fetchall():
        print "%2d %s" % (id, name)
        i=i+1
        if i==100:
            break
        
返回结果:
-4 TEXT
-3 DATE
-2 INT
-1 STRING
1 TOP
2 教育
3 机构
4 人
5 地区
6 单位
7 科学研究
8 实验室
9 类型
10 学科
11 新闻
12 学科
13 新闻
14 简介
15 通知
16 通知
17 地区
18 省部级实验室
19 国家实验室

如果编码是UTF-8
转载一个解决方案: 其中的use db

Python操作MySQL以及中文乱码的问题  Python操作MySQL需要安装Python-MySQL
可以从网上搜索一下,和一般的Python包一样安装

安装好之后,模块名字叫做MySQLdb ,在Window和Linux环境下都可以使用,试验了一下挺好用,
不过又发现了烦人的乱麻问题,最后用了几个办法,解决了!

我用了下面几个措施,保证MySQL的输出没有乱麻:
    1 Python文件设置编码 utf-8 (文件前面加上 #encoding=utf-8)
    2 MySQL数据库charset=utf-8 
    3 Python连接MySQL是加上参数 charset=utf8 
    4 设置Python的默认编码为 utf-8 (sys.setdefaultencoding(utf-8)

mysql_test.py
     #encoding=utf-8
import sys
import MySQLdb

reload(sys)
sys.setdefaultencoding('utf-8')

db=MySQLdb.connect(user='root',charset='utf8')
cur=db.cursor()
cur.execute('use mydb')
cur.execute('select * from mytb limit 100')

f=file("/home/user/work/tem.txt",'w')

for i in cur.fetchall():
     f.write(str(i))
     f.write(" ")

f.close()
cur.close() 
上面是linux上的脚本,windows下运行正常!

注:MySQL的配置文件设置也必须配置成utf8

设置 MySQL 的 my.cnf 文件,在 [client]/[mysqld]部分都设置默认的字符集(通常在/etc/mysql/my.cnf): 
[client]
default-character-set = utf8
[mysqld]
default-character-set = utf8


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值