# coding = utf-8
# 1. Python 数据库API
# 1.1 全局变量
# 所有与DB API2.0兼容的数据库模块都必须包含三个全局变量(apilevel, threadsafety,paramstyle),
# 它们描述了模块的特征
# API级别(apilevel)是一个字符串常量,指出了使用的API版本。DB API2.0指出,这个变量的值为'1.0'或'2.0'。
# 如果没有这个变量,就说明模块不与DB API 2.0 兼容,应假定使用的是DB API 2.0
# 线程安全程度(threadsafety)是一个0~3的整数。0表示不能共享模块,而3表示模块是绝对安全的。
# 1表示线程可以共享模块本身,但不能共享连接,而2表示线程可共享模块和连接,但不能共享游标。
# 如果你不使用线程,就根本不用关心这个变量
# 参数风格(paramstyle)表示当你执行多个类似的数据库查询时,如何在SQL查询中插入参数。
# 'format'表示标准字符串格式设置方式(使用基本的格式编码),如在要插入参数的地方插入%s。
# 'pyformat'表示扩展的格式编码,即旧式字典插入使用的格式编码,如%(foo)s。
# 'qmark'表示问号,'numeric'表示使用:1和:2这样的形式表示字段(其中的数字是参数的编号),
# 而'named'表示使用:foobar这样的形式表示字段(其中foobar为参数名)
# 1.2 异常
# 可以使用except块来捕捉异常
# Warning 发生非致命问题时引发 超类:StandardError
# Error 所有错误条件的超类 超类:StandardError
# InterfaceError 与接口(而不是数据库)相关的错误 超类:Error
# DatabaseError 与数据库相关的错误的超类 超类:Error
# DataError 与数据相关的问题,如值不在合法的范围内 超类:DatabaseError
# OperationalError 数据库操作内部的错误 超类:DatabaseError
# IntegrityError 关系完整性遭到破坏,如键未通过检查 超类:DatabaseError
# InternalError 数据库内部的错误,如游标无效 超类:DatabaseError
# ProgrammingError 用户编程错误,如未找到数据库表 超类:DatabaseError
# NotSupportedError 请求不支持的功能 如回滚 超类:DatabaseError
# 1.3 连接和游标
# 函数connect
# dsn 数据源名称,具体含义随数据库而异 是否可选:否
# user 用户名 是否可选:是
# password 用户密码 是否可选:是
# host 主机名 是否可选:是
# database 数据库名程 是否可选:是
# 函数connect 返回一个连接对象,表示当前到数据库的会话
# 函数connect返回对象的方法
# close() 关闭连接对象,之后,连接对象及其游标将不可用
# commit() 提交未提交的事务,commit方法总是可用的,但如果数据库不支持事务,这个方法就什么都不做。
# 关闭连接时,如果还有未提交的事务,将隐式的回滚它们--但且仅当数据库支持回滚时才如此。
# rollback() 回滚未提交事务,可能不可用,因为并非所有的数据库都支持事务(事务其实就是一系列操作)。
# 可用时,这个方法撤销所有未提交的事务
# cursor() 返回连接的游标对象
# 游标对象方法
# callproc(name[, params]) 使用指定的参数调用指定的数据库过程(可选)
# close() 关闭游标。关闭后游标不可用
# execute(oper[,params]) 执行一个SQL操作----可能指定参数
# executemaany(oper, pseq) 执行指定的SQL操作多次,每次都序列中的一组参数
# fetchmany([size]) 取回查询结果中的多行,其中参数size的值默认为arraysize
# fetchall() 以序列的序列的方式取回余下的所有行
# nextset() 跳到下一个结果集,这个方法是可选的
# setinputsizes(sizes) 用于为参数预定义内存区域
# setoutputsizes(sizes) 为取回大量数据而设置缓冲区长度
# 游标对象的属性
# description 由结果列描述组成的序列(只读)
# rowcount 结果包含的行数(只读)
# arraysize fetchmany返回的行数,默认为1
# 1.4 类型
# 对于插入到某些类型的列中的值,底层SQL数据库可能要求它们满足一定的条件
# DB API定义了一些构造函数和常量(单例)
# Date(year,month,day) 创建包含日期值的对象
# Time(hour,minute,second) 创建包含时间值的对象
# Timestamp(y,mon,d,h,min,s) 创建包含时间戳的对象
# DateFromTicks(ticks) 根据从新纪元开始过去的秒数创建包含日期值的对象
# TimeFromTicks(ticks) 根据从新纪元开始过去的秒数创建包含时间值的对象
# TimestampFromTicks(ticks) 根据从新纪元开始过去的秒数创建包含时间戳的对象
# Binary(string) 创建包含二进制字符串值的对象
# STRING 描述基于字符串的列(如CHAR)
# BINARY 描述基于二进制的列(如LONG或RAW)
# DATETIME 描述基于日期/时间的列
# NUMBER 描述基于数字的列
# ROWID 描述行ID列
# 2. SQLite 和 PySQLite
# 要使用Python标准库中的SQLite,可通过导入模块sqlite3来导入它,然后,就可创建直接到数据库文件的连接
# 为此,只需提供一个文件名(可以是文件的相对路径或绝对路径);如果指定的文件不存在,将自动创建它
import sqlite3
conn = sqlite3.connect('somedatabase.db')
# 接下来可从连接处获得游标
curs = conn.cursor()
# 这个游标可用来执行SQL查询。执行完查询后,
# 如果修改了数据库,务必提交所做的修改,这样才能将其保存到文件中
conn.commit()
# 在每次修改数据库后,关闭数据库
conn.close()
# 数据库应用程序示例
import sqlite3
def convert(value):
if value.startswith('~'):
return value.strip('~')
if not value:
value = '0'
return float(value)
conn = sqlite3.connect('somedatabase.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,
sugar FLOAT
)
''')
query = 'INSERT INTO food VALUES (?,?,?,?,?,?,?,?,?,?)'
field_count = 10
for line in open('/Users/58ershouche/Downloads/sr25upd/ADD_ABBR.txt'):
fields = line.split('^')
vals = [convert(f) for f in fields[:field_count]]
curs.execute(query,vals)
conn.commit()
conn.close()
# 查询代码 示例
# 查询 food_query.py
# import sqlite3, sys
# conn = sqlite3.connect('/Users/58ershouche/Desktop/Python 学习/Python/somedatabase.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(names, row):
# print('{}:{}'.format(*pair))
# print()
# 在命令行中输入 python3 food_query.py " kcal>=100 AND fiber>=10 ORDER BY sugar "
Python 数据库
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 零:说明 Records是一个对python中关系型数据库查询的封装,简化了在python中进行数据库查询的操作。...