【问题标题】:Is it possible to create table in postgresql dynamically?是否可以在 postgresql 中动态创建表?
【发布时间】:2019-08-19 08:45:23
【问题描述】:

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

我想创建包含最大列的表,因此为没有额外列的报告填充 0。但也不知道以后csv文件里会不会有更多的列。

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

【问题讨论】:

  • 您可以将数据加载到只有一列的临时表中,然后使用string_to_array() 将每一行动态拆分为数组元素并检查您获得的列数。或者使用类似file_text_array_fdw:github.com/adunstan/file_text_array_fdw

标签: postgresql csv create-table


【解决方案1】:

经过一番摸索,我想出了一个适合我的解决方案,尽管我担心它不符合优化的编码标准。

关于我设计的方法:

第 1 步:删除表

cur.execute('''DROP TABLE test;''')

第二步:创建一个空表

    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)

【讨论】:

    猜你喜欢
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多