无法使用 Psycopg2 在 Amazon Redshift 中创建表

Posted

技术标签:

【中文标题】无法使用 Psycopg2 在 Amazon Redshift 中创建表【英文标题】:Unable to create table in Amazon redshift using Psycopg2 【发布时间】:2018-06-18 06:02:11 【问题描述】:

我正在尝试在 python 中制作一个简单的脚本,它将从端点获取数据并将其转换为数据帧并将其写入 Amazon redshift 集群,然后使用 aws 的 cronjob 自动执行脚本。我正在使用 psycopg2 连接到 redshift 集群,并且脚本可以很好地执行命令(在 redshift 中创建表并写入数据)。但是当我尝试从 sql 客户端查看表时,表并没有显示出来

from pandas.io.json import json_normalize
import json
import pandas as pd
import requests
import psycopg2
mm_get = requests.get('endpoint link')
mm_json=mm_get.json()
data_1 = json_normalize(data         = mm_json['data'],
                       record_path   = ['courses','modules'],
                       record_prefix = 'courses.modules.',
                       meta          = [['courses', 'id'], 
                                        ['courses', 'title'],
                                        'activated', 
                                        'createdAt', 
                                        'email', 
                                        'employeeId', 
                                        'firstName', 
                                        'group', 
                                        'id', 
                                        'lastName', 
                                        'phone', 
                                        'teams'
                                       ]
                       )
data_2 = json_normalize(data         = mm_json['data'],
                       record_path   = 'lessons',
                       record_prefix = 'lessons.',
                       meta          = 'id',
                       meta_prefix   = 'user.'
                       )
data_3 = data_1.merge(
    data_2,
    how = 'outer', 
    left_on = ['courses.modules.id', 'id'],
    right_on = ['lessons.moduleId', 'user.id']
)

cols = data_3.columns
cols = cols.tolist()
cols = pd.DataFrame(cols)
re_cols = pd.DataFrame(cols.loc[:,0].str.replace('.','_').tolist(),index=cols.index)
data_3.teams = data_3.teams.astype(str)
data_3.teams = data_3.teams.str.replace('[','')
data_3.teams = data_3.teams.str.replace(']','')
data_3.teams = data_3.teams.str.replace("'","")

con=psycopg2.connect(dbname='name',
                     host='hostname',
                     port='xxxx',user='username',password='password')
cur = con.cursor()
cur.execute('create table testing_learn.test (courses_modules_completionDate DATE, courses_modules_id int,  courses_modules_status TEXT,courses_modules_title TEXT, courses_id int,courses_title TEXT, activated bool, createdAt TIMESTAMP, email TEXT, employeeId TEXT, firstName TEXT, group_name TEXT, id TEXT, lastname TEXT, phone int8, teams TEXT, lessons_courseId int, lessons_date DATE, lessons_id int, lessons_lessonNumber int, lessons_moduleId int,lessons_score TEXT, lessons_title TEXT,user_id int);')
cur.close()
data_mat = data_3.as_matrix()
str_mat = b','.join(cur.mogrify('(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',x) for x in tuple(map(tuple,data_mat)))
cur = con.cursor()
cur.execute('insert into testing_learn.test VALUES '+str_mat.decode('utf-8'))

当我使用 psycopg2 从 python 查询同一个表时,我能够看到数据,但同一个表没有出现。如果有人可以帮助解决我在这里做错的事情,那将是非常有帮助的。提前致谢。

【问题讨论】:

唯一可能的情况是,您在与sql client 连接时可能使用了不正确的usernam/schema/url,或者您在insert sql 之后可能不是commiting 事务。 你可以通过python查看数据但是同一张表没有出现?请清除您可以看到的地方和不可以看到的地方。 @NitinSingh 是的,我可以在 python 中看到,但在数据库中看不到 @RedBoy 如何在插入 sql 后提交事务?有什么建议吗? conn.commit() 提交事务,类似地,conn.begin() 开始事务, 【参考方案1】:

根据Psycopg2-2.7.5official documentation,Psycopg2的主要入口点包括:

类连接封装了一个数据库会话。它允许: 使用 cursor() 方法创建新的游标实例以执行数据库命令和查询, 使用方法 commit() 或 rollback() 终止事务。

因此,您需要在每次调用cur.execute() 后调用con.commit() 以使对数据库的更改持久化。否则您的表将不会显示在数据库中。

【讨论】:

以上是关于无法使用 Psycopg2 在 Amazon Redshift 中创建表的主要内容,如果未能解决你的问题,请参考以下文章

psycopg2/python 将数据从 postgresql 复制到 Amazon RedShift(postgresql)

使用 Amazon Redshift 从 Python psycopg2 中的游标获取大于 MAX INT 的行数

尝试使用 Postgres 连接到数据库,但无法将 Amazon 服务器上的地址转换为 Amazon 数据库

无法使用 XCode4 在 OSX 10.6.7 上安装 psycopg2

无法使用 psycopg2 从亚马逊红移读取列类型

使用 Psycopg2 将 Spark DataFrame 写入 Redshift 时出错:无法腌制 psycopg2.extensions.cursor 对象