9.5 sqlite3--SQLite数据库DB-API2.0接口

本模块主要提供了对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',100.0,35.15)

数据库里经常要使用sql语句,而sql语句又经常需要并接参数,如果使用Python里的字符串连接方式,会非常不安全,导致sql语句注入式攻击。因此DB-API提供了问号?替换符方式来达到拼接字符串,主要使用函数execute()来实现,例子如下:

purchases = [('2006-03-28','IBM',1000,45.00),

('2006-04-05','MSFT',72.00),

('2006-04-06','SELL',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',35.14)

('2006-03-28',45.0)

('2006-04-06',53.0)

('2006-04-05',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是一个单参数的调用对象,然后它把这个参数的值转换为intfloatstr或者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)

默认下,不能查看任何用户自定义的回调函数输出。如果想查看相关的输出,需要调用函数设置参数flagTrue才可以。


蔡军生 QQ:9073204 深圳

相关文章

安装 在Windows上安装SQLite。 访问官网下载下Precompliled Binaries for Windows的两个压缩包。 创建s...
一、安装 下载地址:http://www.sqlite.org/download.html 将Precompiled Binaries for Windows下的包下...
实例: 会员信息管理 功能:1.查看数据库 2.清空数据库 3.增加会员 4.删除会员 5.更新会员 6.查找会员  ...
关于SQLite SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、延迟时间和整...