You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 20:15:04