94 lines
4.4 KiB
Python
94 lines
4.4 KiB
Python
# 第 4-1 课练习:从 TOML 配置连接 PostgreSQL
|
||
#
|
||
# 本文件只提供题目,不包含导入、代码骨架、测试数据或参考答案。
|
||
# 请完成只读查询,不要创建表,也不要新增、修改或删除远程数据库中的数据。
|
||
|
||
|
||
# 第一部分:准备并定位配置文件
|
||
# 1. 导入 pathlib.Path、tomllib 和 psycopg。
|
||
# 2. 使用 Path(__file__).with_name("config.toml") 得到配置文件路径,
|
||
# 并保存为 CONFIG_PATH。
|
||
# 3. 复制 config.example.toml,重命名为 config.toml,再填写本地连接信息。
|
||
# 4. 不得修改环境变量,也不得把真实连接信息写入 Python 文件。
|
||
#
|
||
# 与 Java 对照:
|
||
# - config.toml 类似独立的 application.yml 或 properties 本地配置;
|
||
# - CONFIG_PATH 类似确定配置资源位置;
|
||
# - 本课手动读取配置,后续框架可能负责自动绑定配置对象。
|
||
|
||
# 第二部分:读取 TOML 配置
|
||
# 1. 定义 load_database_config(config_path) 函数。
|
||
# 2. config_path 不存在时抛出 RuntimeError,消息为:
|
||
# “未找到 config.toml,请先复制并填写配置文件。”。
|
||
# 3. 使用 config_path.open("rb") 和 with 打开文件。
|
||
# 4. 调用 tomllib.load(config_file),保存完整配置。
|
||
# 5. 使用配置节名称 postgresql 取得数据库配置字典。
|
||
# 6. 配置节不存在或不是字典时抛出:
|
||
# RuntimeError("config.toml 缺少 [postgresql] 配置节。")
|
||
# 7. 返回 postgresql 配置字典。
|
||
|
||
|
||
# 第三部分:执行参数化只读查询
|
||
# 1. 定义 query_lesson_info(database_config, lesson_name, lesson_number) 函数。
|
||
# 2. 调用 psycopg.connect(**database_config),并使用 with 管理 Connection。
|
||
# 3. 调用 connection.cursor(),并使用第二层 with 管理 Cursor。
|
||
# 4. 调用 cursor.execute() 执行:
|
||
# SELECT current_database(), %s::text, %s::integer
|
||
# 5. 把 lesson_name 和 lesson_number 组成二元素元组,作为 execute() 的第二个参数。
|
||
# 6. 不得使用 f-string、字符串拼接或 % 运算把参数拼进 SQL。
|
||
# 7. 调用 cursor.fetchone(),把返回值保存到 result。
|
||
# 8. 离开两层 with 后,如果 result 是 None,抛出:
|
||
# RuntimeError("数据库没有返回练习结果。")
|
||
# 9. 解包并返回 database_name、returned_name、returned_number。
|
||
|
||
|
||
# 第四部分:组织 main() 正常流程
|
||
# 1. 定义 main()。
|
||
# 2. 调用 load_database_config(CONFIG_PATH),保存 database_config。
|
||
# 3. 调用:
|
||
# query_lesson_info(database_config, "PostgreSQL 与 Psycopg 入门", 1)
|
||
# 4. 保存返回的三个结果。
|
||
# 5. 分别使用 print() 输出:
|
||
# “当前数据库:实际数据库名”
|
||
# “课程名称:PostgreSQL 与 Psycopg 入门”
|
||
# “课程编号:1”
|
||
|
||
|
||
# 第五部分:处理异常
|
||
# 1. 在 main() 中使用 try...except 包围配置读取和数据库查询。
|
||
# 2. 捕获 OSError、tomllib.TOMLDecodeError 和 RuntimeError,输出:
|
||
# “配置读取失败:{错误信息}”,然后结束 main()。
|
||
# 3. 捕获 psycopg.Error,输出“数据库访问失败:{错误信息}”,然后结束 main()。
|
||
# 4. 添加程序入口判断并调用 main()。
|
||
#
|
||
# 缺少配置文件时的预期输出:
|
||
# 配置读取失败:未找到 config.toml,请先复制并填写配置文件。
|
||
#
|
||
# 正确连接后的预期输出格式:
|
||
# 当前数据库:python_course
|
||
# 课程名称:PostgreSQL 与 Psycopg 入门
|
||
# 课程编号:1
|
||
#
|
||
# 注意:第一行的 python_course 只是示例,应以实际数据库名为准。
|
||
|
||
# 自查清单:
|
||
# 1. 是否通过当前 Python 文件位置定位 config.toml?
|
||
# 2. 是否没有读取、设置或修改任何环境变量?
|
||
# 3. 是否没有在 Python 文件中填写真实账号、密码和主机地址?
|
||
# 4. Connection 和 Cursor 是否都使用 with 管理?
|
||
# 5. 是否使用 **database_config 把配置字典传给 psycopg.connect()?
|
||
# 6. SQL 和参数是否通过 execute() 的两个参数分别传入?
|
||
# 7. 是否保存并检查了 fetchone() 的结果?
|
||
# 8. 是否分别处理配置异常和 psycopg.Error?
|
||
|
||
|
||
# 最终验收标准:
|
||
# 1. practice.py 可以通过 Python 语法检查;
|
||
# 2. 缺少 config.toml 时能输出指定的中文提示;
|
||
# 3. 配置正确时能连接 PostgreSQL 并输出数据库名、课程名和课程编号;
|
||
# 4. 查询全程只读,不产生远程数据库写入;
|
||
# 5. SQL 使用参数化查询,不存在字符串拼接;
|
||
# 6. 连接和游标能够可靠关闭;
|
||
# 7. 程序不读写环境变量;
|
||
# 8. config.toml 和真实连接信息没有进入 Git 跟踪文件。
|