Postgresql:如何将多个列从一个表复制到另一个表?

时间:2017-09-14 16:25:52

标签: python postgresql

我正在尝试使用temporarytable中的scalingData将名为psycopg2的表格中的某些列复制到另一个名为python的列中。

scalingData是一个pandas数据帧。数据框包含来自城市的数据,例如:nameOfCitiespopulation等。

scalingData = pd.read_csv('myFile.csv')  ## 'myFile.csv' is the datasource

数据框的每一列都有不同类型的数据,例如'int64''float64''O'

这是从Jupyter

拍摄的屏幕截图

enter image description here

import psycopg2 as ps
## Populate table scalingData
tmp = scalingData.dtypes
con = None
con = ps.connect(dbname = 'mydb', user='postgres', host='localhost', password='mypd')
con.autocommit = True
cur = con.cursor()
for i in range(0,5):
    j = header[i]
    stat = """  ALTER TABLE "scalingData" ADD COLUMN "%s" """%j
    if tmp[i] == 'int64':
        stat = stat+'bigint'
    if tmp[i] == 'float64':
        stat = stat+'double precision'
    if tmp[i] == 'O':
        stat = stat+'text'
    ### Add Column
    cur.execute(stat)
    stat1 = """INSERT INTO "scalingData" ("%s") SELECT "%s" FROM temporarytable"""%(j,j)
    ### Copy Column
    cur.execute(stat1)
cur.close()    
con.close()

我的问题是,如果我查看scalingData,只会复制第一列,而其他列则为空。

此处查询pgAdmin表格的屏幕截图:

此外,如果我将第二列复制为第一列,则可以使用,但随后它也会失败。

2 个答案:

答案 0 :(得分:2)

发生这种情况是因为您在新表中添加了1个字段,而不是仅在设置了该字段时插入数据,并且您执行了5次。所以你实际上应该看到原始表的5个副本,只设置了1个字段。

您需要先为scalingData表设置结构,然后插入包含所有字段的所有记录。

这是代码(不是Python开发人员):

import psycopg2 as ps
## Populate table scalingData
tmp = scalingData.dtypes
con = None
con = ps.connect(dbname = 'mydb', user='postgres', host='localhost', password='mypd')
con.autocommit = True
cur = con.cursor()
for i in range(0,5):
    j = header[i]
    stat = """  ALTER TABLE "scalingData" ADD COLUMN "%s" """%j
    if tmp[i] == 'int64':
        stat = stat+'bigint'
    if tmp[i] == 'float64':
        stat = stat+'double precision'
    if tmp[i] == 'O':
        stat = stat+'text'
    ### Add Column
    cur.execute(stat)

fieldsStr = '"' + '", "'.join([header]) + '"' ### will return "header1", "header2", ... , "header5"
stat1 = """INSERT INTO "scalingData" (%s) SELECT %s FROM temporarytable"""%(fieldsStr,fieldsStr)
### Copy Table
cur.execute(stat1)

cur.close()    
con.close()

答案 1 :(得分:0)

我不熟悉Python,但只是猜测问题可能来自哪里:

"""INSERT INTO "scalingData" ("%s") SELECT "%s" FROM temporarytable"""

...会将"%s"位转换为"foo, bar, baz"而不是"foo", "bar", "baz"

换句话说,你应该删除语句中不需要的双引号,而不是转义单个列名。

PG中使用双引号来引用标识符。您可以逐字地拥有一个名为"foo, bar, baz"的表或列,并且当您执行时PG将正常工作 - 只要在语句中使用它时,它总是在双引号之间。