如何在不使用ORM的情况下用Python编写SQL操作PostgreSQL数据库?
首先明确:你用os.popen()操作PostgreSQL本质是调用系统自带的psql命令行工具执行SQL,本身就不涉及ORM,操作逻辑如下:
操作前提
确保运行环境已安装psql工具,且配置了正确的数据库访问权限,优先用环境变量、pgpass文件存储认证信息,避免在命令里明文写密码。
基础执行逻辑
psql执行单条SQL的标准命令格式为:psql -h <数据库地址> -p <端口> -U <用户名> -d <数据库名> -c "<要执行的SQL语句>"
如果需要解析返回的查询结果,可以额外加-t -A -F $'\t'参数,作用是取消表头输出、关闭对齐格式、用制表符分隔字段,大幅降低结果解析成本。
常用操作示例
查询操作
import os # 数据库连接配置 db_config = { "host": "127.0.0.1", "port": "5432", "user": "postgres", "dbname": "test_db" } # 要执行的查询SQL query_sql = "SELECT id, name, create_time FROM users WHERE status = 1 LIMIT 10;" # 构造执行命令 cmd = f"psql -h {db_config['host']} -p {db_config['port']} -U {db_config['user']} -d {db_config['dbname']} -tA -F $'\\t' -c \"{query_sql}\"" # 执行并解析结果 with os.popen(cmd) as f: result = f.read().strip() if result: # 按行拆分后按制表符拆分,得到结构化列表 query_data = [line.split("\t") for line in result.split("\n")] print(query_data) else: print("未匹配到查询结果")
增删改操作
这类操作不需要解析返回结果,只要判断执行状态即可,可以加-q参数屏蔽不必要的输出:
import os db_config = { "host": "127.0.0.1", "port": "5432", "user": "postgres", "dbname": "test_db" } # 插入SQL示例,更新、删除操作替换SQL即可 write_sql = "INSERT INTO users (name, age, status) VALUES ('张三', 25, 1), ('李四', 30, 1);" cmd = f"psql -h {db_config['host']} -p {db_config['port']} -U {db_config['user']} -d {db_config['dbname']} -q -c \"{write_sql}\"" # 获取执行返回码,None表示执行成功,非0表示执行失败 return_code = os.popen(cmd).close() if return_code is None: print("数据写入成功") else: print(f"操作失败,错误码:{return_code}")
注意事项
- 绝对不要直接拼接用户输入的内容到SQL语句中,会存在SQL注入风险,所有外部输入必须做特殊字符转义或者严格的格式校验后再使用
- 密码不要直接写在命令里,会被系统进程列表明文查看到,建议配置
PGPASSWORD环境变量或者pgpass文件存储认证信息 - 如果需要更精细的错误处理、捕获错误日志,更推荐用
subprocess模块替代os.popen,可控性更强 - 批量操作尽量合并为单次命令执行,减少进程反复启动的开销
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

