sqlite3是一个轻量级的数据库工具,它不需要单独的进程来维护数据库,一般可以用于本地数据的存储。下面通过实例介绍它的基本使用方法。
数据库的打开,关闭
使用connect(database [,timeout ,other optional arguments])
方法创建连接。
- 当一个数据库被多个连接访问,且其中一个修改了数据库,此时数据库被锁定,直到事务提交。timeout 参数表示连接等待锁定的持续时间,直到发生异常断开连接。timeout 参数默认是 5.0(5 秒)。
- 如果给定的数据库名称database不存在,该调用将创建一个数据库。如果不想在当前目录中创建数据库,那么可以指定带有路径的文件名,这样就能在任意地方创建数据库。
数据库操作完成后,用
close()
方法关闭。import sqlite3 conn = sqlite3.connect("data.db") conn.close()
可以使用
:memory:
作为参数,表示数据库保存在内存中conn = sqlite3.connect(":memory:")
创建游标
对数据库的所有操作都是通过游标实现的,游标有点类似于文件操作中的文件句柄。通过下面的方法可以创建游标。
c = conn.cursor()
创建数据表
下面的语句创建了一张含有date,trans,symbol,qty和price这5个数据的表。
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)")
在SQL语句中使用变量值
有时候在构建SQL语句时希望使用python中的变量,这个时候请不要直接使用python的字符串操作(容易引起问题),而是使用模块占位符“?”。 在希望使用变量的地方用占位符替代,提供一个包含所有用到参数的元组作为execute命令的第二个参数。
# 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)
# 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)
查询数据
# 返回symbol等于IBM的记录的所有字段
c.execute("SELECT * FROM stocks WHERE symbol = 'IBM'")
# 返回symbol等于IBM的记录的date,price两个字段
c.execute("SELECT date, price FROM stocks WHERE symbol = 'IBM'")
有三种方法可以用来操作SELECT语句查询的数据
- 将查询结果当做迭代器使用
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)
- 使用游标的
fetchone()
方法,该方法获取查询结果集中的下一行,返回一个单一的序列,当没有更多可用的数据时,则返回 None。
c.execute('SELECT date, symbol, price FROM stocks WHERE symbol = "RHAT"')
res = c.fetchone()
print(res)
('2006-01-05', 'RHAT', 35.14)
print(res[0])
2006-01-05
print(res[1])
RHAT
print(res[2])
35.14
res = c.fetchone()
print(res)
None
- 使用游标的
fetchall()
方法,该方法获取查询结果集中所有(剩余)的行,返回一个列表。当没有可用的行时,则返回一个空的列表。
c.execute('SELECT * FROM stocks ORDER BY price')
res = c.fetchall()
print(res)
[('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)]
更新数据
c.execute("UPDATE stock SET price = 25 WHERE symbol = 'RHAT'")
删除数据
c.execute("DELETE FROM stock WHERE symbol = 'IBM'")
print "Total number of rows deleted :", conn.total_changes
提交和回滚
commit()
:用于提交当前的事务。如果未调用该方法,那么自上一次调用commit()
以来所做的任何动作对其他数据库连接来说是不可见的。
rollback()
:用于取消自上一次调用commit()
以来对数据库所做的更改。
其它
- cursor.executemany(sql, seq_of_parameters):对 seq_of_parameters 中的所有参数或映射执行一个 SQL 命令。
- cursor.executescript(sql_script):一旦接收到脚本,会执行多个 SQL 语句。它首先执行 COMMIT 语句,然后执行作为参数传入的 SQL 脚本。所有的 SQL 语句应该用分号(;)分隔。
- connection.total_changes():返回自数据库连接打开以来被修改、插入或删除的数据库总行数。