【问题标题】:PostgreSQL relation doesn't exist (Python)PostgreSQL 关系不存在 (Python)
【发布时间】: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


【解决方案1】:

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

  1. 连接数据库
  2. 使用游标创建表
  3. 填表
  4. 提交和断开与数据库的连接。

或者,如果您必须将创建与填充分开,只需在 (2) 之后提交并断开连接,然后在 (3) 之前重新连接。

【讨论】:

  • 啊,我在 psql 中创建表,但使用 python 代码加载数据(因此它试图在表存在后创建连接)。让我试试这个。
  • psql(使用默认设置)自动提交;所以,在那里创建一个表,然后通过代码填充它,应该可以工作。如果它对您有用,请接受答案并投票。 :-)
  • 我在那里放了一个我的代码示例。这仍然会引发我之前遇到的相同错误。我想我按照你说的对吗?
  • 我没试过,但看起来不错。请粘贴完整的确切错误。
  • 实拍,我看是不一样的错误。它说:“psycopg2.IntegrityError:重复键值违反唯一约束“tid_pkey”详细信息:键(tid)=(776571048946831400)已经存在。”
猜你喜欢
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多