【发布时间】:2017-01-22 17:35:39
【问题描述】:
我在 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()
【问题讨论】:
-
in the psql window it works and shows an empty table.但是(没有行)它是一个空表! [顺便说一句,在创建表 DDL 之后应该有一个;] -
对,我是说在 psql 窗口中存在关系(它应该是空的,因为我没有添加数据 - 我只是在检查以确保创建工作)。抱歉,我写命令时确实有冒号,我只是在这里忘记了。
-
您提交了吗(在“psql 窗口”中)?
-
哦,我想如果我使用 CREATE TABLE 它已经在那里了(对不起,我是新手)。如何提交新表?当我试图只说 COMMIT 时;它只是说没有交易正在进行中。
-
不仅DML,DDL也是事务的一部分。其他会话无法看到未提交的事务。[顺便说一句:下一次,请在您的问题中添加完整的工作代码,包括所需的
import psycopg2, json和一些数据。]
标签: python json postgresql twitter psycopg2