无法创建Heroku PostgreSQL表,执行建表语句后查询提示relation不存在
你遇到的relation "files" does not exist错误,核心原因是事务未提交:
psycopg2 默认关闭自动提交,所有数据库写操作(包括建表这类DDL语句)执行后,都需要主动调用连接的commit()方法才会真正生效。你当前的代码执行完建表语句后直接关闭了连接,未提交的事务会被自动回滚,等于建表操作根本没有生效。
解决方案
- 方案1:修改建表代码新增提交逻辑
修改后的代码如下:
import psycopg2.extras import psycopg2 from os import environ URL = environ["DATABASE_URL"] conn = psycopg2.connect(URL) cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) cur.execute( "CREATE TABLE files (id SERIAL PRIMARY KEY, FileName VARCHAR(255) UNIQUE NOT NULL, Content TEXT );") # 新增事务提交语句 conn.commit() conn.close() print("TABLE CREATED")
重新执行修改后的代码即可完成建表。
- 方案2:开启自动提交(适合一次性操作场景)
如果不想每次执行写操作都手动提交,可以在创建连接时开启自动提交属性:
conn = psycopg2.connect(URL) conn.autocommit = True
后续所有执行的SQL语句都会自动提交,不需要额外调用commit()。
验证建表结果
你可以直接在本地终端执行heroku pg:psql进入数据库命令行,输入\dt命令查看所有表,确认files表存在即可。
关于Procfile的补充说明
你当前遇到的表不存在问题和Procfile没有关联:
Procfile是用来定义Heroku应用启动时需要运行的进程命令的配置文件,只有你需要部署长期运行的服务(比如Web接口、定时任务等)时才需要配置。如果只是执行一次性的建表脚本,不需要配置Procfile。
如果你后续需要部署Python Web应用,只需要在项目根目录新建名为Procfile的文件,写入对应启动命令即可,比如Flask应用的配置为:web: gunicorn 你的启动文件名:app实例名。
内容的提问来源于stack exchange,提问作者hemant kumar
相关产品推荐
相关产品推荐

