PostgreSQL关系不存在(Python)

时间:2017-01-22 17:35:39

标签: python json postgresql twitter psycopg2

我在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()

1 个答案:

答案 0 :(得分:0)

你可能没有提交表创建,并且,(我假设;没有看到你的完整代码)你每次都通过psycopg2开始新的连接。您需要在创建表后立即提交,并且在新连接中,因为每个连接都是其自己的隐式事务。所以,你的代码流应该是这样的:

  1. 连接到数据库
  2. 使用光标
  3. 创建表格
  4. 填写表格
  5. 提交并断开与db的连接。
  6. 或者,如果您必须将创建与填充分开,只需在(2)之后提交并断开连接,然后在(3)之前重新连接。