# 第 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 跟踪文件。