是否可以在postgresql中动态创建表?

时间:2019-08-19 08:45:23

标签: postgresql csv create-table

我正在尝试从一个csv文件创建一个postgresql表。问题是,每次我下载csv文件时,它都有不同的列集。

我想到了创建带有最大列的表,从而为没有多余列的报告填充0。但是我也不知道将来在csv文件中是否还会有更多列。

预期:我应该能够在postgres数据库中动态创建一个表,其中包含与当天生成的csv文件相对应的必需列。

2 个答案:

答案 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)
相关问题