简介
SQLite 是一个C库,它提供了一个轻量级的基于磁盘的数据库,不需要一个单独的服务进程。允许使用非标准的SQL查询语言的变体访问数据库。 一些应用程序可以使用SQLite进行存储内部数据。也可以使用SQLite建立应用原型,随后再将数据或代码移植到大型的数据库,比如PostgreSQL或Oracle.
sqlite3模块由Gerhard Haring编写,提供了一个sql接口,该接口和PEP 249描述的DB-API 2.0规范兼容。
若要使用该模块,必须首先创建一个表示数据库的连接/connection对象。例如这边的例子,将数据存储到example.db文件:
import sqlite3
conn = sqlite3.connect('example.db')
还可以使用特殊名称:memory:在RAM(内存)中创建数据库。
一旦有了一个连接/connection,就可以创建cursor/游标对象并调用其execute()方法来执行SQL命令:
c = conn.cursor()
# Create table
c.execute('''CREATE TABLE stocks
(data text, trans text, symbol text, qty real, price real)''')
# Insert a row of data
c.execute("INSERT INTO stocks VALUES('2006-01-05', 'BUY', 'RHAT', 100, 35.15)")
# Save(commit) the changes
conn.commit()
# We can also close the connection if we are done with it.
# Just be sure any changes have been committed or they will be lost.
conn.close()
保存过的数据是持久的并在以后的会话中可用:
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
通常的SQL操作需要使用Python变量中的值。不应该使用Python的字符串操作来组装查询,因为这样是不安全的。容易受到SQL注入攻击。
相反,应该使用DB API参数替代。对于你想使用的值,用?作为一个占位符,给游标的execute()方法的第二个参数提供一个值的元组。其他的数据库模块可能使用不同的占位符,如%s或:1。例如:
# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
# Do this instead
t = ('RHAT')
c.execute("SELECT * FROM stocks WHERE symbol = ?', t)
print c.fetchone()
# Larger example that inserts many records at a time
purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
('2006-04-06', 'SELL', 'IBM', 500, 53.00),
]
c.executemany('INSERT INTO stocks VALUES(?,?,?,?,?)', purchases)
为了取回select语句的执行结果,可以把游标cursor当做一个迭代器,通过调用游标的fetchone()方法来获取单行结果;或者通过调用fetchall()方法获取结果集列表。
例如:
>>> for row in c.execute('SELECT * FROM stocks ORDER BY price'):
print row
(u'2006-01-05', u'BUY', u'RHAT', 100, 35.14)
(u'2006-03-28', u'BUY', u'IBM', 1000, 45.0)
(u'2006-04-06', u'SELL', u'IBM', 500, 53.0)
(u'2006-04-05', u'BUY', u'MSFT', 1000, 72.0)
参考资料
https://github.com/ghaering/pysqlite
The pysqlite web page – sqlite3 is developed externally under the name “pysqlite”.
http://www.sqlite.org/ The SQLite web page; the documentation describes the syntax and the available data types for the supported SQL dialect.
http://www.w3schools.com/sql/ Tutorial, reference and examples for learning SQL syntax.
相关模块函数和常量
sqlite3.version
该模块的字符串形式的版本号,不是SQLite库的版本
sqlite3.version_info
该模块的整数元组形式的版本号,不是SQLite库的版本
sqlite3.sqlite_version
SQLite库的版本号,字符串形式
sqlite3.sqlite_version_info
SQLite库的版本号,整数元组形式。
sqlite3.PARSE_DECLTYPES
该常量用于connect()函数的detect_typed参数
设置它使得sqlite3模块解析每个返回列的声明的类型。它将解析出声明的类型的第一个单词,比如, “inter primary key", 它将解析出"integer", 而"number(10)",将解析出”number"。然而对应那列,它将查询转换器字典并对类型使用对应注册的转换器函数。
sqlite3.PARSE_COLNAMES
该常量用于connect()函数的detect_typed参数
设置它使得SQLite接口解析每个返回列的列名。它将查找[mytype]形式的字符串,然后决定'mytype'是列的类型。将会尝试在转换器字典中找到对应于“mytype"的转换器,然后将转换器函数应用于返回的值。Cursor.description中找到的列名只是列名的第一个单词,即,如果SQL中有类似
sqlite3.connect(database[,timeout, detect_types, isolation_level,check_same_thread, factory, cached_statements])
打开到SQLite数据库文件database的连接。可以使用:memory: 打开内存的数据库连接。
当多个连接访问数据库,其中一个进程修改了数据库,SQLite数据库会锁定,直到事务被提交。timeout参数指明为了得到锁,连接最多等待的时间,如果超时会抛出异常。超时参数默认为5s.
对于isolation_level参数,请参阅connection对象的Connection.isolation_level属性。
SQLite原生只支持文本、整数、实数、BLOB和NULL类型。如果想使用其他类型,需要自行添加。detect_types参数和使用由register_converter()函数注册的自定义转换器。
detect_types默认为0(即关闭),可以设置为PARSE_DECLTYPES和PARSE_COLNAMES的任意组合用来打开类型检测。
默认情况下,sqlite3模块使用Connection类以调用connect.然而,可以继承Connection类,通过将子类提供给factory参数,使得connect()使用你的子类
SQLite3模块内部使用语句缓存来避免SQL解析开销。如果想要显示设置连接所缓存的语句的数量,可以设置cached_statements参数。在当前实现中的默认设置是缓存100条语句。
sqlite3.register_converter(typename, callable)
注册可调用对象用来将来自数据库的bytestring转换成为自定义的python类型。对数据库所有有typename类型的值调用该可调用的对象。
sqlite3.register_converter(typename, callable)
注册可调用对象用来将来自数据库的bytestring转换成为自定义的Python类型。对数据库所有有typename类型的值调用该可调用对象。参见connect()函数的detect_types参数以了解类型检测是如何工作的。请注意typename的大小写和查询中类型的名称必须匹配 !
sqlite3.register_adapter(type, callable)
注册可调用对象用来将自定义的 Python 类型type转换为 SQLite 的支持的类型。可调用对象callable接受一个Python值为参数,返回值的类型必须为如下类型之一:int,long,float,str (UTF-8 编码), unicode 或缓冲。
sqlite3.complete_statement(sql)
如果字符串sql包含一个或多个以分号结束的完整的SQL语句则返回True 。它不验证SQL的语法正确性,只是检查没有未关闭的字符串常量以及语句是以分号结束的。
这可以用于生成一个 sqlite shell,如以下示例所示:
A minimal SQLite shell for experiments
import sqlite3
con = sqlite3.connect(":memory:")
con.isolation_level = None
cur = con.cursor()
buffer = ""
print "Enter your SQL commands to execute in sqlite3."
print "Enter a blank line to exit."
while True:
line = raw_input()
if line == "":
break
buffer += line
if sqlite3.complete_statement(buffer):
try:
buffer = buffer.strip()
cur.execute(buffer)
if buffer.lstrip().upper().startswith("SELECT"):
print cur.fetchall()
except sqlite3.Error as e:
print "An error occurred:", e.args[0]
buffer = ""
con.close()
sqlite3.enable_callback_tracebacks(flag)
默认情况下你不会在用户定义的函数、 聚合、 转换器、 授权者回调等地方得到回溯对象(调用栈对象)。如果想要调试它们,将flag设置为True调用此函数。之后可以在sys.stderr通过回调得到回溯。使用False来再次禁用该功能。
<未完待续>