【Python教程13】-数据库支持

📅 发布时间:2026/7/6 9:27:47 👁️ 浏览次数:
【Python教程13】-数据库支持
13、Python 教程 - 数据库支持本章讨论 Python 数据库 API一种连接到 SQL 数据库的标准化方式并演示如何使用这个 API 来执行一些基本的 SQL。最后本章将讨论其他一些数据库技术。关 Python 支持的数据库清单Python 数据库 API标准数据库 APIDB APIPython 官方维基百科中的数据库编程指南全局变量变量名描述apilevel使用的 Python DB API 版本是一个字符串常量指出了使用的 API 版本。threadsafety模块的线程安全程度如何是一个 0~3含的整数。0 表示线程不能共享模块而 3 表示模块是绝对线程安全的。1 表示线程可共享模块本身但不能共享连接而 2 表示线程可共享模块和连接但不能共享游标。paramstyle在 SQL 查询中使用哪种参数风格format’表示标准字符串格式设置方式使用基本的格式编码如在要插入参数的地方插入 %s。pyformat’表示扩展的格式编码即旧式字典插入使用的格式编码如 %(foo)sqmark’表示使用问号numeric’表示使用:1 和:2 这样的形式表示字段其中的数字是参数的编号而’named’表示使用:foobar 这样的形式表示字段其中 foobar 为参数名异常异常超类描述StandardError所有异常的超类WarningStandardError发生非致命问题时引发ErrorStandardError所有错误条件的超类InterfaceErrorError与接口而不是数据库相关的错误DatabaseErrorError与数据库相关的错误的超类DataErrorDatabaseError与数据相关的问题如值不在合法的范围内OperationalErrorDatabaseError数据库操作内部的错误IntegrityErrorDatabaseError关系完整性遭到破坏如键未通过检查InternalErrorDatabaseError数据库内部的错误如游标无效ProgrammingErrorDatabaseError用户编程错误如未找到数据库表NotSupportedErrorDatabaseError请求不支持的功能如回滚连接和游标要使用底层的数据库系统必须先连接到它为此可使用名称贴切的函数 connect。接受多个参数具体是哪些取决于要使用的数据库。函数 connect 的常用参数参数名描述是否可选dsn数据源名称具体含义随数据库而异否user用户名是password用户密码是host主机名是database数据库名称是函数 connect 返回一个连接对象表示当前到数据库的会话。连接对象的方法方法名描述——close()关闭连接对象。之后连接对象及其游标将不可用commit()提交未提交的事务——如果支持的话否则什么都不做rollback()回滚未提交的事务可能不可用cursor()返回连接的游标对象游标对象的方法名称描述——callproc(name[, params])使用指定的参数调用指定的数据库过程可选close()关闭游标。关闭后游标不可用execute(oper[, params])执行一个 SQL 操作——可能指定参数executemany(oper, pseq)执行指定的 SQL 操作多次每次都序列中的一组参数fetchone()以序列的方式取回查询结果中的下一行如果没有更多的行就返回 Nonefetchmany([size])取回查询结果中的多行其中参数 size 的值默认为 arraysizefetchall()以序列的序列的方式取回余下的所有行nextset()跳到下一个结果集这个方法是可选的setinputsizes(sizes)用于为参数预定义内存区域setoutputsize(size[, col])为取回大量数据而设置缓冲区长度游标对象的属性名称描述——description由结果列描述组成的序列只读rowcount结果包含的行数只读arraysizefetchmany 返回的行数默认为 1类型DB API 构造函数和特殊值名称描述Date(year, month, day)创建包含日期值的对象Time(hour, minute, second)创建包含时间值的对象Timestamp(y, mon, d, h, min, s)创建包含时间戳的对象DateFromTicks(ticks)根据从新纪元开始过去的秒数创建包含日期值的对象TimeFromTicks(ticks)根据从新纪元开始过去的秒数创建包含时间值的对象imestampFromTicks(ticks)根据从新纪元开始过去的秒数创建包含时间戳的对象Binary(string)创建包含二进制字符串值的对象STRING描述基于字符串的列如 CHARBINARY描述二进制列如 LONG 或 RAWNUMBER描述数字列DATETIME描述日期/时间列ROWID描述行 ID 列SQLite 和 PySQLite起步导入模块 sqlite3 来导入 Python 标准库中的 SQLitimport sqlite3#导入模块sqlite3 conn sqlite3.connect(beyond.db)#连接数据库若数据库不存在则自动创建 curs conn.cursor()#从连接获得游标这个游标可用来执行SQL查询。 conn.commit()#在每次修改数据库后都进行提交 conn.close()#关闭连接数据库应用程序示例ABBREV.txt 数据库信息放在与程序同一个目录下 ABBREV.txt 在文件 ABBREV.txt 中每行都是一条数据记录字段之间用脱字符^分隔。数字字段直接包含数字而文本字段用两个波浪字符~将其字符串值括起。将这个 ASCII 文件中的数据转换为 SQL 数据库****1创建并填充数据库表创建一个名为 food 的表读取文件 ABBREV.txt 并对其进行分析通过调用 curs.execute 来执行一条 SQL INSERT 语句从而将字段中的值插入数据库中。将数据导入数据库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, sugar 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()当你运行这个程序时文件 ABBREV.txt 和它位于同一个目录它将新建一个名为 food.db 的文件其中包含数据库中的所有数据。2搜索并处理结果数据库查询程序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(names, row): print({}: {}.format(*pair)) print()小结概念解释Python DB API这个 API 定义了一个简单的标准化接口所有数据库包装器模块都必须遵循它这让编写使用多个不同数据库的程序更容易。连接连接对象表示到 SQL 数据库的通信链路使用方法 cursor 可从连接获得游标。你还可使用连接对象来提交或回滚事务。使用完数据库后就可将连接关闭了。游标游标用于执行查询和查看结果。可逐行取回查询结果也可一次取回很多或全部行。类型和特殊值DB API 指定了一组构造函数和特殊值的名称。构造函数用于处理日期和时间对象还有二进制数据对象而特殊值用于表示关系型数据库的类型如 STRING、NUMBER 和 DATETIME。SQLite这是一个小型的嵌入式 SQL 数据库标准 Python 发行版中包含其 Python 包装器即模块 sqlite3。这个数据库速度快、易于使用且不要求搭建专门的服务器。本章介绍的函数函数描述connect(…)连接到数据库并返回一个连接对象