Files

94 lines
4.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第 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 跟踪文件。