python数据库编程 界面_python数据库编程_sqlite

原文请看: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 stocks4 (date text, trans text, symbol text,5 qty real, price real)''')6 #Insert a row of data

7 c.execute("""insert into stocks8 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 importsqlite33 con = sqlite3.connect(":memory:")4 con.isolation_level =None5 cur =con.cursor()6 buffer = ""

7 print("Enter your SQL commands to execute in sqlite3.")8 print("Enter a blank line to exit.")9 whileTrue:10 line =input()11 if line == "":12 break

13 buffer +=line14 ifsqlite3.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语句中,应该说很有前途

importsqlite3importhashlibdefmd5sum(t):returnhashlib.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 importsqlite32 classMySum:3 def __init__(self):4 self.count =05 defstep(self, value):6 self.count +=value7 deffinalize(self):8 returnself.count9 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 importsqlite32 defdict_factory(cursor, row):3 d ={}4 for idx, col inenumerate(cursor.description):5 d[col[0]] =row[idx]6 returnd7 con = sqlite3.connect(":memory:")8 con.row_factory =dict_factory9 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 importsqlite32 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 stocks4 (date text, trans text, symbol text,5 qty real, price real)''')6 c.execute("""insert into stocks7 values ('2006-01-05','BUY','RHAT',100,35.14)""")8 conn.commit()9 c.close()10 >>> conn.row_factory =sqlite3.Row11 >>> c =conn.cursor()12 >>> c.execute('select * from stocks')13

14 >>> r =c.fetchone()15 >>>type(r)16

17 >>>r18 (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: printmember28 ...29 2006-01-05

30 BUY31 RHAT32 100.0

33 35.14

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值