python - 脚本不执行 cur.execute() 中的命令
问题描述
我是 PostgreSQL 和 psycopg2 的新手,我遇到了一个问题。
import psycopg2
def create_tables(whichone):
in_str_station = "CREATE TABLE station (id SMALLINT NOT NULL PRIMARY KEY, name VARCHAR(40) NOT NULL," \
" country VARCHAR(3) NOT NULL, latitude VARCHAR(10), " \
"longitude VARCHAR(10),height SMALLINT);"
in_str_dailyData = "CREATE TABLE daily_data (id BIGSERIAL NOT NULL PRIMARY KEY," \
"s_id SMALLINT NOT NULL REFERENCES station(id)," \
"d_date DATE NOT NULL, d_mean NUMERIC(6, 1), quality SMALLINT);"
int_str_monthlyMean = "CREATE TABLE monthly_mean (id BIGSERIAL NOT NULL PRIMARY KEY,"\
"s_id SMALLINT NOT NULL REFERENCES station(id),"\
"m_date DATE NOT NULL, m_mean NUMERIC(9, 3),"\
"var NUMERIC(9, 3), std NUMERIC(9, 3));"
in_str_yearlymean = "CREATE TABLE yearly_mean (id BIGSERIAL NOT NULL PRIMARY KEY, " \
"s_id SMALLINT NOT NULL REFERENCES station(id)," \
"y_date DATE NOT NULL, y_mean NUMERIC(9, 3),var NUMERIC(9, 3)," \
"std NUMERIC(9, 3), var_m NUMERIC(9, 3), std_m NUMERIC(9, 3));"
database_list = {'station': in_str_station, 'monthly_mean': int_str_monthlyMean,
'daily_data': in_str_dailyData, 'yearly_mean': in_str_yearlymean}
try:
conn = psycopg2.connect(
host="localhost",
database="climate",
user="postgres",
password="1")
cur = conn.cursor()
in_str = database_list.get(whichone)
cur.execute(in_str)
output_ = cur.fetchall()
print(output_)
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
运行脚本后,无论选择哪一个 in_str_,都不会创建表。我已经检查过了,当我复制我在 cur.execute 中执行的 in_str 的内容并在PostgreSQL shell 中使用它时,一切正常。
我在哪里犯了错误?
解决方案
调用conn.commit()
之后cur.execute()
,但之前conn.close()
。事务不会通过 psycopg2隐式提交:
如果连接在事务进行时关闭(使用 close() 方法)或销毁(使用 del 或让它超出范围),则服务器将丢弃该事务。
推荐阅读
- javascript - 单击时,将搜索图标更改为关闭图标
- javascript - Javascript 在 Safari 中不起作用
- ssl - 通过自定义域为 GitHub Pages 站点提供服务时偶尔出现 SSL 错误
- r - 填充 3D 数组的有效方法
- hadoop - 在不更改现有 HIVE 架构的情况下从 HIVE 访问 ENUM 到 IMPALA
- windows - 在 Windows 机器上访问 Ras Pi 3 phpmyadmin
- c - 结构数据的 C 内存分配顺序
- java - Java绘图(初级)
- node.js - 从多页应用程序进行身份验证后,如何在初始下载期间将 JWT 令牌加载到 React?
- javascript - Monoidal List的功能链如何存储数据?