Python 数据库

# 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 数据库)