原文请看: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语句中,应该说很有前途

  1. import sqlite3
  2. import hashlib
  3. def md5sum(t):
  4. return hashlib.md5(t).hexdigest()
  5. con = sqlite3.connect(":memory:")
  6. con.create_function("md5", 1, md5sum)
  7. cur = con.cursor()
  8. cur.execute("select md5(?)", ("foo",))
  9. 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

python数据库编程_sqlite的更多相关文章

  1. python数据库编程小应用

    python DB api 数据库连接对象connection数据库交互对象cursor数据库异常类exceptions 流程:开始创建connection获取cursor执行查询.执行命令.获取数据 ...

  2. Python数据库编程

    http://lizhenliang.blog.51cto.com/7876557/1874283 http://blog.itpub.net/22664653/list/1/?cid=86471

  3. python数据库(mysql)操作

    一.软件环境 python环境默认安装了sqlite3,如果需要使用sqlite3我们直接可以在python代码模块的顶部使用import sqlite3来导入该模块.本篇文章我是记录了python操 ...

  4. python-网络安全编程第四天(数据库编程&网络编程)

    前言 好几天没更因为寒假放假回家放松了几天 嘿嘿 今天继续开始启动学习模式. python数据库编程 Python DB API访问数据库流程 Python DB API包含的内容 什么是 PyMyS ...

  5. 运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库

    运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程 有关前两篇的链接: 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 运 ...

  6. 自学Python之路-Python并发编程+数据库+前端

    自学Python之路-Python并发编程+数据库+前端 自学Python之路[第一回]:1.11.2 1.3

  7. Python学习系列(七)( 数据库编程)

    Python学习系列(七)( 数据库编程)        Python学习系列(六)(模块) 一,MySQL-Python插件       Python里操作MySQL数据库,需要Python下安装访 ...

  8. Python程序设计9——数据库编程

    1 数据持久化 持久化是将内存中的对象存储在关系数据库中,当然也可以存储在磁盘文件.XML数据文件中.实现数据持久化至少需要实现以下3个接口 void Save(object o):把一个对象保存到外 ...

  9. python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点

    python 闯关之路四(下)(并发编程与数据库编程)   并发编程重点: 1 2 3 4 5 6 7 并发编程:线程.进程.队列.IO多路模型   操作系统工作原理介绍.线程.进程演化史.特点.区别 ...

随机推荐

  1. mysql 修改max_connections

    1.使用命令show variables 来查看当前最大连接数 show variables like '%max_connections%'; 使用命令set global max_connecti ...

  2. JavaScript知识之判断字符串中出现最多的字符及次数

    var str = 'asdddasdfdseeeeeweeeeeeeeeeeee'; var json = {}; // 定义json一个对象 for(var i = 0; i < str.l ...

  3. html 5 新特性

    现在html 5技术是最新的html标准,掌握html 5已经变得非常重要,以下是我查看相关资料后对html 5 的新特性的总结,方便大家对比学习.html 5的新特性1.取消了一些过时的html 4 ...

  4. [洛谷P2051] [AHOI2009]中国象棋

    洛谷题目链接:[AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法 ...

  5. Spring mvc 增加静态资源配置后访问不了注解配置的controller

    spring mvc 增加静态资源访问配置. 例如: <!-- 静态资源映射 --> <mvc:resources location="/static/" map ...

  6. 天气预报service

    https://weather.com/ https://api.weather.com/v2/turbo/vt1dailyForecast?apiKey=c1ea9f47f6a88b9acb43ab ...

  7. 【usaco-Earthquake, 2001 Open】 0-1分数规划 & 最优比率生成树

    题意:给定n个点m条边,一开始这些边全都是断的,要修一些边使得n个点全部联通.修完一共可以得到F元,修一条边有成本di和时间ti,要使得 得到的钱数 / 总时间 这个比值最大. 参考资料: 红线内的内 ...

  8. 【BZOJ】4430: [Nwerc2015]Guessing Camels赌骆驼

    [题意]给定三个长度为n的排列,求在三个排列中顺序相同的数对个数. [算法]逆序对 [题解]很容易联想到NOIP火柴排队,涉及顺序问题显然和逆序对息息相关. 一个数对如果在三个排列中顺序不同,一定是1 ...

  9. springboot:Spring boot中mongodb的使用(山东数漫江湖)

    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...

  10. java和C和C++关系

    java和C以及C++ 直接关联,java继承了C的语法,java的对象模型是从C++改编而来的.java和C以及C++关系之所以重要,下面几个就是原因: ①如果一个程序员熟悉C以及C++语法,那么他 ...