13.1Python数据库API
13.1.1 全局变量
变量名 | 描述 |
---|---|
apilevel | 使用的Python DB API 的版本 |
threadsafety | 模块的线程安全程度 |
paramstyle | 在SQL查询中使用哪种参数 |
apilevel:字符串常量,没有这变量的时候说明模块与DB API2.0不兼容。
threadsafety:包含0,12,3四个整数,0表示线程不能共享模块,1表示可共享模块,但不能共享连接,2表示可共享模块与连接,但不共享游标,3表示模块是绝对线程安全。
13.1.2异常
异常(超类) | 描述 |
---|---|
StandardError | 所有异常的超类 |
Waring(Standarderror) | 发生非致命问题时引发 |
Error(Standarderror) | 所有错误条件的超类 |
InterfaceError(Error) | 与接口相关的错误 |
DatabaseError(Error) | 与数据库相关的错误的超类 |
OperationalError(DatabaseError以下的超类都是这个) | 数据库操作内部的错误 |
DataError | 与数据相关问题,如值不在合法的范围 |
IntegrityError | 关系完整性遭到破坏,如键未通过检查 |
InternalError | 数据库内部的错误,如游标无效 |
ProgrammingError | 用户编程错误,如未找到数据库 |
NotSupportedError | 请求不支持的内容,如回滚 |
13.1.3连接和游标
函数connect的常用参数:
参数名 | 描述(是否可选) |
---|---|
dsn | 数据源名称,具体含义随数据库而异 (否) |
user | 用户名(是) |
password | 用户密码(是) |
host | 主机名(是) |
database | 数据库名称(是) |
函数connect返回的连接对象支持的方法:
方法名 | 描述 |
---|---|
close() | 关闭连接对象,关闭后连接对象及其游标将不可用 |
commit() | 在支持的情况下提交未提交的事务 ,否则什么也不做 |
rollback() | 回滚未提交的事物 |
cursor() | 返回连接的游标对象 |
游标:使用游标来执行SQL查询和查看结果。P235
13.1.4类型
P236
13.2 SQLite和PySQLite
SQLite:小的数据库引擎,不需要作为独立的服务器运行,且可以使用本地文件,不需要集中式数据库存储机制
PySQLite:在Python中的标准库的SQLite包装器,通过使用模块sqlite3实现。
13.2.1起步
import sqlite3
conn=splite3.connect('somedatabase.db')#创建连接到数据库的文件
curs=conn.cursor #l连接获得的游标
conn,commit()
conn.close()
13.2.2数据库应用程序示例
#将数据导入数据
import sqlite3
def convert(value):
if value.startswith('~'):
return value.strip('~')
if not value:
value='0'
return float(value)
conn=sqlite3.connect('food,db')
curs=conn.cursor()
curs.execute('''
CREATE TABLE food(
id TEXT PRIMARY KEY,
desc TEXT,
water FLOAT,
kcal FLOAT,
protein FLOAT,
fat FLOAT,
ash FLOAT,
carbs FLOAT,
fiber FLOAT,
suger FLOAT,
)
''')
query='INSERT INTO food VALUES(?,?,?,?,?,?,?,?,?,?)'
field_count=10
for line in open ('ABBREV.txt'):
fields=line.split('^')
vals=[convert(f) for f in fields [:field_count]]
curs.execute(query,vals)
conn.commit()
conn,close()
#食品数据库查询程序
import sqlite3,sys
conn=sqlite3.connect('food.db')
curs=conn.cursor()
query='SELECT * FROM food WHERE '+sys.argv[1]
print(query)
curs.execute(query)
names=[f[0] for f in curs.description]
for row in curs.fetchall():
for pair in zip (name ,row):
print('{}:{}'.format(*pair))
print()