python数据库编程_sqlite
2013-07-30 16:34 江湖么名 阅读(2582) 评论(0) 编辑 收藏 举报原文请看:http://blog.csdn.net/jj_liuxin/article/details/3584448
sqlite是一个轻量级的数据库,与很多大型的数据库(例如DB2,Oracle,MSSQL,MYSQL,PostgreSQL)相比,它不需要一个 Server Process,因此更相像于其他的小型数据库,例如Access,而且事实上,它的作用很类似于Access,不过由于缺乏商业支持,没有像 Access一样提供丰富的界面组件,相信如果需要的话,其实不是很难做的。
前面也用到过sqlite,例如在对pickle模块的学习,以及我所写的下载糗事百科的程序中都大量的使用到了sqlite,这里将python对sqlite的支持抽取出来专门进行讲解。
从python 2.5开始(前面的我就不知道了,没用过~,现在用的python
3.0,相信可以用上5年吧),python提供了对sqlite3的内生支持,一般来说,可以在PythonDir/Dlls/文件夹下发现
sqlite3.dll和_sqlite3.pyd
,这2个文件是python支持sqlite3的基础;其次就是下面说要描述的sqlite3模块了。
在文档中有一个pysqlite模块,该模块和DB-API 2.0(python的DB API,其文档位于http://www.python.org/dev/peps/pep-0249)兼容。
其实与数据库的交互操作是很简单的,基本的操作只有2步:连接数据库,执行SQL语句。
一、sqlite3模块入门
1)连接数据库
在python中连接sqlite3数据库有2种模式,一种是内存中的sqlite3数据库,一种是磁盘上的sqlite3数据库,这2种数据库的差别不仅在于方便和效率上,另外内存中的任何操作都不需要commit,这个下面再说。
cn=sqlite3.connect(database[, timeout, isolation_level, detect_types, factory])
该函数返回一个Connection对象;其中的database指数据库文件的地址,如果要使用内存中的数据库可以使用:memory:代替;如果有多个Connection存取同一个数据库,同一时间只有一个进程可以更改数据库(select语句不受限制)
2)执行SQL语句
执行SQL语句在sqlite3模块中是很容易实现的,无论是Select、还是Update、Insert、Delete,在sqlite3中的实现方法是一致的,具体如下:
cursor=cn.cursor()
cursor.execute(SQL)
#cursor.execute(SQL,tuple) 当SQL语句中有参数时,可以将参数放在tuple中。
#cursor.commit() 当涉及Update、Insert、Delete语句时需要这一条语句
cursor.close()
例子:
1 c = conn.cursor() 2 # Create table 3 c.execute('''''create table stocks 4 (date text, trans text, symbol text, 5 qty real, price real)''') 6 # Insert a row of data 7 c.execute("""insert into stocks 8 values ('2006-01-05','BUY','RHAT',100,35.14)""") 9 # Save (commit) the changes 10 conn.commit() 11 # We can also close the cursor if we are done with it 12 c.close()
二、sqlite3高级操作
1>sqlite3.register_converter(typename,callable)
据说是将数据库中提取出来的内容转化为python的类型,但是没看懂
2>sqlite3.register_adapter(type,callable)
上面那个函数倒过来的,同样没看懂
3>sqlite3.complete_statement(sql)
当sql中为一条或多条可执行的SQL语句时返回True.
文档中使用该语句完成了一个小型的Sqlite命令行,很有意思。
1 # A minimal SQLite shell for experiments 2 import sqlite3 3 con = sqlite3.connect(":memory:") 4 con.isolation_level = None 5 cur = con.cursor() 6 buffer = "" 7 print("Enter your SQL commands to execute in sqlite3.") 8 print("Enter a blank line to exit.") 9 while True: 10 line = input() 11 if line == "": 12 break 13 buffer += line 14 if sqlite3.complete_statement(buffer): 15 try: 16 buffer = buffer.strip() 17 cur.execute(buffer) 18 if buffer.lstrip().upper().startswith("SELECT"): 19 print(cur.fetchall()) 20 except sqlite3.Error as e: #python 3.0中异常的写法,不会的快学 21 print("An error occurred:", e.args[0]) 22 buffer = "" 23 con.close()
4>Connection类
sqlite3.Connection类很用来管理与sqlite3数据库的链接的,主要有
4.1 Connection.isolation_level 一般设置为None就可以了,或者干脆就不要管了
4.2 Connection.cursor() 大家很熟悉了,也不怎么需要叙述
4.3 Connection.commit() 该方法很重要,如果你对数据库进行了更新,那么一定要使用该方法,否则其他对该数据库的链接无法察觉到你的更新;如果你更新了数据库,而又体现不出来,多半就是因为没调用这个函数了。
4.4 Connection.rollback() 可以取消最后一次的commit
4.5 Connection.close() 太简单了,没什么可说的
4.6 Connection.execute(sql[, params])
4.7 Connection.executemany(sql[, params])
4.8 Connection.executescript(sql_script)
4.9 Connection.create_function(name,params_num,func)
这个函数很有趣,可以对该Connection创建一个函数,函数名为name,函数为func,函数的参数个数为params_num
这个函数可以用于SQL语句中,应该说很有前途
import sqlite3 import hashlib def md5sum(t): return hashlib.md5(t).hexdigest() con = sqlite3.connect(":memory:") con.create_function("md5", 1, md5sum) cur = con.cursor() cur.execute("select md5(?)", ("foo",)) print(cur.fetchone()[0])
4.10 Connection.create_aggregate(name,params_num,class)
和上面那个很像,不过由函数变成类了
1 import sqlite3 2 class MySum: 3 def __init__(self): 4 self.count = 0 5 def step(self, value): 6 self.count += value 7 def finalize(self): 8 return self.count 9 con = sqlite3.connect(":memory:") 10 con.create_aggregate("mysum", 1, MySum) 11 cur = con.cursor() 12 cur.execute("create table test(i)") 13 cur.execute("insert into test(i) values (1)") 14 cur.execute("insert into test(i) values (2)") 15 cur.execute("select mysum(i) from test") 16 print(cur.fetchone()[0])
4.11 Connection.interrupt()
可以从其他线程终止该Connection上的所有查询。
4.12 Connection.row_factory
可以使用该属性来更改返回值的表现方式,例如返回为字典之类或更高级的方式
这个方法也很有发展前途。
1 import sqlite3 2 def dict_factory(cursor, row): 3 d = {} 4 for idx, col in enumerate(cursor.description): 5 d[col[0]] = row[idx] 6 return d 7 con = sqlite3.connect(":memory:") 8 con.row_factory = dict_factory 9 cur = con.cursor() 10 cur.execute("select 1 as a") 11 print(cur.fetchone()["a"])
4.13 Connection.total_changes
连接的总更改条数
5>游标对象
sqlite.Cursor
5.1 cursor.execute(sql[,params])
很easy,随便贴个例子了
1 import sqlite3 2 con = sqlite3.connect("mydb") 3 cur = con.cursor() 4 who = "Yeltsin" 5 age = 72 6 cur.execute("select name_last, age from people where name_last=? and age=?", (who, age)) 7 cur.execute("select name_last, age from people where name_last=:who and age=:age", 8 {"who": who, "age": age}) 9 print(cur.fetchone())
5.2 cursor.executemany(sql[,params])
5.3 cursor.executescript(sql_script)
5.4 cursor.fetchone()
5.5.cursor.fetchmany()
5.6 cursor.fetchall()
5.7 cursor.rowcount
这个熟悉不太好使,建议大家不要用它
5.8 cursor.description
只用于select语句,返回一行的列名,为了Python DB API兼容,返回值为1*7的数组,但事实上后面的六个数为None
6>Row
这个类很有趣,很实用,可以让行对象看起来像列表,又像字典,用法很简单,只需要将Connection的row_factory设置为Row对象即可,例子如下
1 conn = sqlite3.connect(":memory:") 2 c = conn.cursor() 3 c.execute('''''create table stocks 4 (date text, trans text, symbol text, 5 qty real, price real)''') 6 c.execute("""insert into stocks 7 values ('2006-01-05','BUY','RHAT',100,35.14)""") 8 conn.commit() 9 c.close() 10 >>> conn.row_factory = sqlite3.Row 11 >>> c = conn.cursor() 12 >>> c.execute('select * from stocks') 13 <sqlite3.Cursor object at 0x7f4e7dd8fa80> 14 >>> r = c.fetchone() 15 >>> type(r) 16 <type 'sqlite3.Row'> 17 >>> r 18 (u'2006-01-05', u'BUY', u'RHAT', 100.0, 35.140000000000001) 19 >>> len(r) 20 5 21 >>> r[2] 22 u'RHAT' 23 >>> r.keys() 24 ['date', 'trans', 'symbol', 'qty', 'price'] 25 >>> r['qty'] 26 100.0 27 >>> for member in r: print member 28 ... 29 2006-01-05 30 BUY 31 RHAT 32 100.0 33 35.14