本模块主要提供了对SQLite数据库进行操作的接口。SQLite数据库是一个C写的轻量级的文件型数据库,它不需要独立的进程运行,可以直接嵌入应用程序里的数据库。本模块提供的数据库接口,与其它大型的数据库接口是一样的,因此编写的SQL语句是可以直接应用于PostgreSQL或者Oracle数据库。
为了使用本模块,需要先创建一个Connection对象,用来表示数据库接口,下面来访问数据库example.db作为例子:
import sqlite3
conn = sqlite3.connect(‘example.db’)
也可以使用参数:memory:来创建一个内存数据库。
一旦成功创建Connection对象,就可以使用这个对象来创建Cursor对象,并调用方法execute()来执行合法的SQL语句。
创建数据库的例子:
#python 3.4
import sqlite3
#创建数据库连接对象
conn = sqlite3.connect('example.db')
c = conn.cursor()
#创建数据库表
c.execute('''CREATE TABLE stocks
(date text, trans text, symbol text, qty real, price real)''')
#插入一行数据
c.execute("INSERT INTO stocks VALUES ('2016-02-16', 'BUY', 'RHAT', 100, 35.15)")
#提交
conn.commit()
#关闭连接
conn.close()
查询数据库的例子:
#打开数据库查询相关内容
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print(c.fetchone())
conn.close()
结果输出如下:
('2016-02-16', 'BUY', 'RHAT', 100.0, 35.15)
在数据库里经常要使用SQL语句,而SQL语句又经常需要并接参数,如果使用Python里的字符串连接方式,会非常不安全,导致SQL语句注入式攻击。因此DB-API提供了问号?替换符方式来达到拼接字符串,主要使用函数execute()来实现,例子如下:
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语句返回多条数据,可以使用迭代器的方式来访问所有返回的数据,也可以使用函数fetchone()来一条数据一条数据地返回,也可以使用函数fetchall()获取所有数据返回。下面是使用迭代器的例子:
for row in c.execute('SELECT * FROM stocks ORDER BY price'):
print(row)
('2006-01-05', 'BUY', 'RHAT', 100, 35.14)
('2006-03-28', 'BUY', 'IBM', 1000, 45.0)
('2006-04-06', 'SELL', 'IBM', 500, 53.0)
('2006-04-05', 'BUY', 'MSFT', 1000, 72.0)
9.5.1 模块函数和常量
sqlite3.version
本模块的版本号,以字符串方式返回,要注意的是,它不是SQLite数据库的版本号。
例子:
#python 3.4
import sqlite3
print('sqlite3.version:', sqlite3.version)
结果输出如下:
sqlite3.version: 2.6.0
sqlite3.version_info
本模块的版本号,以元组方式返回,要注意的是,它不是SQLite数据库的版本号。
例子:
#python 3.4
import sqlite3
print('sqlite3.version_info:', sqlite3.version_info)
结果输出如下:
sqlite3.version_info: (2, 6, 0)
sqlite3.sqlite_version_info
返回SQLite数据库的版本号,以元组的方式返回。
例子:
#python 3.4
import sqlite3
print('sqlite3.sqlite_version_info:', sqlite3.sqlite_version_info)
结果输出如下:
sqlite3.sqlite_version_info: (3, 8, 3, 1)
sqlite3.PARSE_DECLTYPES
本常量使用在函数connect()里,设置在关键字参数detect_types上面。表示在返回一行值时,是否分析这列值的数据类型定义。如果设置了本参数,就进行分析数据表列的类型,并返回此类型的对象,并不是返回字符串的形式。
sqlite3.PARSE_COLNAMES
本常量使用在函数connect()里,设置在关键字参数detect_types上面。表示在返回一行值时,是否分析这列值的名称。如果设置了本参数,就进行分析数据表列的名称,并返回此类型的名称。
sqlite3.connect(database[, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements, uri])
打开一个SQLite的数据库的文件连接。当参数database名称为“:memory:”时,表示创建一个内存数据库,不会在硬盘上生成文件。当有多个连接访问一个数据库时,如果其中一个进程修改这个数据库,SQLite数据库会锁这个数据库,直到这个数据库的事务完成为止。如果不想被锁住时间过长,可以使用参数timeout来设置等待超时时间,默认的值是5秒,当超时没有打开这个数据库时,就会抛出异常。
参数detect_types是用来指明前面介绍的两个参数。
参数isolation_level是同Conection.isolation_level的属性意义一样。
参数check_same_thread是用来判断是否一个线程只能使用当前线程打开的数据库连接,如果设置为False,就不判断这个。
参数factory是用来设置是否使用派生类。
参数cached_statements是用来设置SQL语句分析的缓冲大小,默认是100条语句。
参数uri设置为True时,表示按URI解析数据库名称,比如:
db = sqlite3.connect('file:path/to/database?mode=ro', uri=True)
例子:
#python 3.4
import sqlite3
from datetime import date, datetime
db = sqlite3.connect(':memory:',
detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
c = db.cursor()
c.execute('''CREATE TABLE example(id INTEGER PRIMARY KEY, created_at DATE)''')
# 插入date对象到数据库
today = date.today()
c.execute('''INSERT INTO example(created_at) VALUES(?)''', (today,))
db.commit()
# 返回插入的对象
c.execute('''SELECT created_at FROM example''')
row = c.fetchone()
print('The date is {0} and the datatype is {1}'.format(row[0], type(row[0])))
db.close()
结果输出如下:
The date is 2016-02-17 and the datatype is <class 'datetime.date'>
sqlite3.register_converter(typename, callable)
注册一个从数据库bytestring转换为自定义Python类型的调用对象。这个调用对象当数据库在读取这个类型的值时被调用。
sqlite3.register_adapter(type, callable)
注册一个从自定义Python类型转换为SQLite支持的数据类型。参数callable是一个单参数的调用对象,然后它把这个参数的值转换为int,float,str或者bytes类型。
sqlite3.complete_statement(sql)
如果sql包含有一条或多条完整的SQL语句,就返回True。不过本函数不会检查SQL语句的合法性。
例子:
#python 3.4
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 = 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才可以。
蔡军生 QQ:9073204 深圳