SQLite 是一个 C 库,它提供了一个轻量级的基于磁盘的数据库 不需要单独的服务器进程,并允许访问数据库 使用 SQL 查询语言的非标准变体。某些应用程序可以使用 用于内部数据存储的SQLite。也可以对 应用程序使用 SQLite,然后将代码移植到更大的数据库,例如 PostgreSQL 或 Oracle。参考:sqlite
sqlite3 模块由 Gerhard Häring 编写。它提供了一个 SQL 接口 符合 PEP 2 描述的 DB-API 0.249 规范。
import sqlite3
# 创建连接对象,如果该数据库文件不存在会自动创建,可以带路径。
# 还可以提供特殊名称以在 RAM 中创建数据库。:memory:
conn = sqlite3.connect('example.db')
#python默认使用<type 'unicode'>类型来处理sqlite3的text类型,否则会提示如下错误:
#OperationalError: Could not decode to UTF-8 column 'gnname' with text 'xxxx'
conn.text_factory = str
# 获取游标对象用来操作数据库
c = conn.cursor()
# 创建表格
c.execute('''CREATE TABLE stocks
(date text, trans text, symbol text, qty real, price real)''')
# 插入一行数据
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
# 提交
conn.commit()
# 关闭链接
conn.close()
通常,您的 SQL 操作需要使用 Python 变量中的值。你 不应该使用 Python 的字符串操作组装你的查询,因为这样做 不安全;它使您的程序容易受到SQL注入攻击 (有关可能出错的幽默示例,请参见 https://xkcd.com/327/ )。
请改用 DB-API 的参数替换。使用?作为占位符 在要使用值的位置,然后提供值元组作为 cursor 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()
print c.fetchall()
# 一次插入多条记录
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 视为迭代器,调用cursor的方法fetchone()检索单个匹配的行,或调用fetchall()以获取 匹配的行。
此示例使用迭代器形式:
for row in c.execute('SELECT * FROM stocks ORDER BY price'):
print row