我在 psql 中创建了一个数据库,并在其中创建了一个名为“tweet”的表。
CREATE TABLE tweet
( tid CHARACTER VARYING NOT NULL, DATA json,
CONSTRAINT tid_pkey PRIMARY KEY (tid) );
然后当我使用
SELECT * FROM tweet;
在 psql 窗口中它工作并显示一个空表。
现在我有一个 python 脚本,它获取 JSON 数据并将其加载到该表中。
conn_string = "host='localhost' port=5432 dbname='tweetsql' user='tweetsql' password='tweetsql'"
conn = psycopg2.connect(conn_string)
cur = conn.cursor()
这样就建立了连接,我认为它没有任何问题。 现在我有一些逻辑可以读取 JSON 文件然后将其添加进去,我说:
cur.execute("INSERT INTO tweet (tid, data) VALUES (%s, %s)", (cur_tweet['id'], json.dumps(cur_tweet, cls=DecimalEncoder), ))
但这总是表示关系推文不存在。我在这里错过了什么吗?我的连接是否存在问题,或者我的脚本是否以某种方式看不到该表?作为引用,我使用 psycopg2 进行连接。
编辑:我更新了 DDL 以包含一个我可以提交的事务,但这也没有解决它。这是架构问题吗?
这就是我对要提交的表创建所做的:
BEGIN;
CREATE TABLE tweet
( tid CHARACTER VARYING NOT NULL, DATA json,
CONSTRAINT tid_pkey PRIMARY KEY (tid) );
COMMIT;
编辑 2:我在这里发布一些代码...
import psycopg2
import json
import decimal
import os
import ctypes
conn_string = "host='localhost' port=5432 dbname='tweetsql' user='tweetsql' password='tweetsql'"
conn = psycopg2.connect(conn_string)
cur = conn.cursor()
cur.execute("CREATE TABLE tweet (tid CHARACTER VARYING NOT NULL, DATA json, CONSTRAINT tid_pkey PRIMARY KEY (tid) );")
cur.commit()
for file in os.listdir(path):
if not is_hidden(file):
with open(path+file, encoding='utf-8') as json_file:
tweets = json.load(json_file, parse_float=decimal.Decimal)
for cur_tweet in tweets:
cur.execute("INSERT INTO tweet (tid, data) VALUES (%s, %s)", (cur_tweet['id'], json.dumps(cur_tweet, cls=DecimalEncoder), ))
cur.commit()
cur.close()
conn.close()
最佳答案
您可能没有提交表创建,并且(我假设;没有看到您的完整代码)您每次都通过 psycopg2 启动新连接。您需要在创建表后立即提交,不要在新连接中提交,因为每个连接都是它自己的隐式事务。因此,您的代码流应该是这样的:
- 连接到数据库
- 使用游标创建表
- 填写表格
- 提交数据库并断开连接。
或者,如果您必须将创建与填充分开,只需在 (2) 之后提交并断开连接,然后在 (3) 之前重新连接。
关于python - PostgreSQL 关系不存在 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41794057/