python - PostgreSQL 关系不存在 (Python)

标签 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()

最佳答案

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

  1. 连接到数据库
  2. 使用游标创建表
  3. 填写表格
  4. 提交数据库并断开连接。

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

关于python - PostgreSQL 关系不存在 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41794057/

相关文章:

postgresql - 遍历记录时访问同名列

java - 尝试将外部数据库 (postgreSQL) 与我的 android 应用程序连接

python - 通过 python 套接字接收数据

python - 如何将 Mysql 的日期范围查询转换为 Django 查询

ruby-on-rails - 随机化数据库记录 ID

json - 使用 JSON1 更新 SQLite 中的 JSON

java - 寻找 @ManyToMany + 存储库完成阶段的示例

python - 类型错误 : can't pickle file objects webpy and subprocess

python - 仅当一个或多个项目时,如何使 for 循环工作!= 'yes'

json - 如何在 Go 语言中读取 JSON