VV's BLOG Dev Engineer

sqlite3模块的使用

2017-03-22

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():返回自数据库连接打开以来被修改、插入或删除的数据库总行数。

Similar Posts

下一篇 Cygwin的使用

Comments