我在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()
答案 0 :(得分:0)
你可能没有提交表创建,并且,(我假设;没有看到你的完整代码)你每次都通过psycopg2开始新的连接。您需要在创建表后立即提交,并且在新连接中不,因为每个连接都是其自己的隐式事务。所以,你的代码流应该是这样的:
或者,如果您必须将创建与填充分开,只需在(2)之后提交并断开连接,然后在(3)之前重新连接。