python连接MySQL
由于之后要做一些统计数据库的工作,所以趁着晚上有空,先提前学一下一直想学的python连接数据库的基本操作。
用python连接数据库的操作其实非常简单,直接调用MySQLdb模板,使用其中的connection()方法即可。现在就一些重要的操作做一下记录。
一,用python连接数据库。
import MySQLdb conn = MySQLdb.connection(host = "xxx.xxx.xxx.xx", user = "user_name", password = "password", db = "db_name" )
完成这一步,其实已经获得了一个代表数据库的对象conn了。接下来就是利用一些方法对数据库进行操作。
二,与数据库进行交互操作。
1,如果后台允许,可以切换其他数据库。
conn.select("db_name")
2, 利用conn.cursor()获得一个指针对象,用于访问和操作数据库。
cur = conn.cursor()
经过2之后就能获得指向数据库数据的指针,接下来就可以进行交互了。
3,首先是利用execute()方法执行sql语句。
>>> cur = conn.cursor() >>> cur <MySQLdb.cursors.Cursor object at 0x7ff6698ee1d0> >>> sql = "desc image_tag" >>> res = cur.execute(sql) >>> res 12L
execute返回的是从sql语句中得到的行数。
4,利用fetchall()方法和fetchone()方法读取数据库的行内容。
从名字中可以看出来,fetchall是获得是执行sql语句得到的所有行数,fetchone则是获得当前行,并别会把指针往后移动。
两个方法的返回值都是一个tuple。
>>>res = cur.execute("select * from testPython") >>> res 7L >>> row = cur.fetchone() >>> row (1L, 'zhao') >>> res = cur.fetchall() >>> res ((10L, 'demno'), (10L, 'demno'), (10L, 'demno'), (10L, 'demno'), (10L, 'demno'), (10L, 'demno'))
从代码中可以看出,res一开始获得是7行数据,经过fetchone之后,再用fetchall只能获得6个元素的元组,说明了指针往后移动了。
5,当然,我们可以利用scroll()函数移动指针。
cur.scroll(step, model)
step:移动的行数,int型,正表示向下移,负值表示向上移动
model:移动的模式,默认是relative,还有absolute模式。
>>> cur.scroll(-1, 'relative') >>> cur <MySQLdb.cursors.Cursor object at 0x7ff6698ee390> >>> res = cur.fetchall() >>> res ((10L, 'demno'),)
这部分代码是接在4中的代码继续的。可以看出,当我们将行数往上移动一步,再进行fetchall的时候只能得到一行。这其实也反应了一个问题,fetchall()方法也是取得所有的行数,并将指针移动到最后一行的。
关于fetchall()这个的解释可以参见http://blog.libears.com/2011-05-20/python/python%E4%B8%AD%E7%9A%84%E6%B8%B8%E6%A0%87
6,conn.commit() ,在我们用execute()方法执行了insert或者delete操作的时候,需要调用这个方法向数据库进行提交事务,才能最终生效。
conn.commit()
当然,还有一些释放资源的方法,比如conn.close()等。
以上只是一些零碎的代码,实际的程序中,还需要进行一些异常捕获,下面贴一个标准模板化的代码。感谢http://www.cnpythoner.com/post/150.html提供代码模板。
import MySQLdb def getdata (): try: conn = MySQLdb.connect(host='localhost', user='root', passwd='root', db='test', port=3306, charset='utf8') try: cur = conn.cursor() sql = r'select * from person' cur.execute(sql) allPerson = cur.fetchall() finally: cur.close() conn.close() except Exception, e: print '数据库错误:', e return
参考文章
http://www.linuxfly.org/post/180/
http://www.2cto.com/kf/201009/74972.html
http://blog.libears.com/2011-05-20/python/python%E4%B8%AD%E7%9A%84%E6%B8%B8%E6%A0%87
http://www.cnpythoner.com/post/150.html