我正在尝试使用temporarytable
中的scalingData
将名为psycopg2
的表格中的某些列复制到另一个名为python
的列中。
scalingData
是一个pandas数据帧。数据框包含来自城市的数据,例如:nameOfCities
,population
等。
scalingData = pd.read_csv('myFile.csv') ## 'myFile.csv' is the datasource
数据框的每一列都有不同类型的数据,例如'int64'
,'float64'
或'O'
。
这是从Jupyter
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
表格的屏幕截图:
此外,如果我将第二列复制为第一列,则可以使用,但随后它也会失败。
答案 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将正常工作 - 只要在语句中使用它时,它总是在双引号之间。