我正在尝试从一个csv文件创建一个postgresql表。问题是,每次我下载csv文件时,它都有不同的列集。
我想到了创建带有最大列的表,从而为没有多余列的报告填充0。但是我也不知道将来在csv文件中是否还会有更多列。
预期:我应该能够在postgres数据库中动态创建一个表,其中包含与当天生成的csv文件相对应的必需列。
答案 0 :(得分:0)
否,当您使用COPY语句时,Postgres不可能为您创建表。
根据https://www.postgresql.org/docs/current/sql-copy.html,您必须指定table_name
:
现有表的名称(可选,由模式限定)。
答案 1 :(得分:0)
经过一番摸索,我想出了一个对我来说很好的解决方案,尽管我担心它不符合优化的编码标准。
关于我设计的方法:
第1步:放下桌子
cur.execute('''DROP TABLE test;''')
第2步:创建一个空表
cur.execute('''CREATE TABLE test();''')
第3步:在for循环中添加列及其数据类型(因为这将是一个循环,将需要时间,具体取决于您的报告大小,因此我提到了这种方法可能不是他的最佳选择)
column_list = list(df.columns)
query = "ALTER TABLE test ADD COLUMN %s;"
for j in range(len(column_list)):
column_name = column_list[j]
if df[column_list].dtypes[j] == 'object':
datatype = 'varchar'
elif df[column_list].dtypes[j] == 'float':
datatype = 'real'
elif report_df[column_list].dtypes[j] == 'int':
datatype = 'int'
elif df[column_list].dtypes[j] == 'bool':
datatype = 'boolean'
column = column_name + " " + datatype
cur.execute(query, (AsIs(column),))
第4步:使用copy_from复制所需文件中的内容
with open('.\test.csv', 'r') as f:
next(f) # skip the header row
cur.copy_from(f, 'test', sep=',', columns=df.columns)