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. 
    3. # Create table
    4. c.execute('''''create table stocks
    5. (date text, trans text, symbol text,
    6.  qty real, price real)''')
    7. 
    8. # Insert a row of data
    9. c.execute("""insert into stocks
    10.           values ('2006-01-05','BUY','RHAT',100,35.14)""")
    11. 
    12. # Save (commit) the changes
    13. conn.commit()
    14. 
    15. # We can also close the cursor if we are done with it
    16. c.close()
    17.


    二、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. 
    3. import
    4. 
    5. con = sqlite3.connect(":memory:")
    6. con.isolation_level = None
    7. cur = con.cursor()
    8. 
    9. buffer = ""
    10. 
    11. print("Enter your SQL commands to execute in sqlite3.")
    12. print("Enter a blank line to exit.")
    13. 
    14. while True:
    15.     line = input()
    16. if
    17. break
    18.     buffer += line
    19. if
    20. try:
    21.             buffer = buffer.strip()
    22.             cur.execute(buffer)
    23. 
    24. if buffer.lstrip().upper().startswith("SELECT"):
    25. print(cur.fetchall())
    26. except sqlite3.Error as e:                             #python 3.0中异常的写法,不会的快学
    27. print("An error occurred:", e.args[0])
    28.         buffer = ""
    29. 
    30. 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
    2. import
    3. 
    4. def
    5. return
    6. 
    7. con = sqlite3.connect(":memory:")
    8. con.create_function("md5", 1, md5sum)
    9. cur = con.cursor()
    10. cur.execute("select md5(?)", ("foo",))
    11. print(cur.fetchone()[0])

    4.10 Connection.create_aggregate(name,params_num,class)


         和上面那个很像,不过由函数变成类了


      1. import
      2. 
      3. class
      4. def __init__(self):
      5. self.count = 0
      6. 
      7. def step(self, value):
      8. self.count += value
      9. 
      10. def finalize(self):
      11. return self.count
      12. 
      13. con = sqlite3.connect(":memory:")
      14. con.create_aggregate("mysum", 1, MySum)
      15. cur = con.cursor()
      16. cur.execute("create table test(i)")
      17. cur.execute("insert into test(i) values (1)")
      18. cur.execute("insert into test(i) values (2)")
      19. cur.execute("select mysum(i) from test")
      20. print(cur.fetchone()[0])
      21.



      4.11 Connection.interrupt()


           可以从其他线程终止该Connection上的所有查询。


      4.12 Connection.row_factory


           可以使用该属性来更改返回值的表现方式,例如返回为字典之类或更高级的方式


           这个方法也很有发展前途。


      1. import
      2. 
      3. def
      4.     d = {}
      5. for idx, col in
      6. 0]] = row[idx]
      7. return
      8. 
      9. con = sqlite3.connect(":memory:")
      10. con.row_factory = dict_factory
      11. cur = con.cursor()
      12. cur.execute("select 1 as a")
      13. print(cur.fetchone()["a"])

      4.13 Connection.total_changes


           连接的总更改条数


      5>游标对象


      sqlite.Cursor


      5.1 cursor.execute(sql[,params])


          很easy,随便贴个例子了

      1. import sqlite3
      2. 
      3. con = sqlite3.connect("mydb")
      4. 
      5. cur = con.cursor()
      6. 
      7. who = "Yeltsin"
      8. age = 72
      9. 
      10. cur.execute("select name_last, age from people where name_last=? and age=?", (who, age))
      11. 
      12. cur.execute("select name_last, age from people where name_last=:who and age=:age",
      13. "who": who, "age": age})
      14. 
      15. 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. 
      11. 
      12. 
      13. >>> conn.row_factory = sqlite3.Row
      14. >>> c = conn.cursor()
      15. >>> c.execute('select * from stocks')
      16. <sqlite3.Cursor object at 0x7f4e7dd8fa80>
      17. >>> r = c.fetchone()
      18. >>> type(r)
      19. <type 'sqlite3.Row'>
      20. >>> r
      21. (u'2006-01-05', u'BUY', u'RHAT', 100.0, 35.140000000000001)
      22. >>> len(r)
      23. 5
      24. >>> r[2]
      25. u'RHAT'
      26. >>> r.keys()
      27. ['date', 'trans', 'symbol', 'qty', 'price']
      28. >>> r['qty']
      29. 100.0
      30. >>> for member in r: print
      31. ...
      32. 2006-01-05
      33. BUY
      34. RHAT
      35. 100.0
      36. 35.14



      注意:该例子是对大小写不敏感的。