将带有默认值列的数据框复制到PostgreSQL表中

4
我有以下的PostgreSQL表格stock,其中结构如下,列insert_time带有默认值now()
|    column   |  pk |    type   |
+-------------+-----+-----------+
| id          | yes | int       |
| type        | yes | enum      |
| c_date      |     | date      |
| qty         |     | int       |
| insert_time |     | timestamp |

我正在尝试复制以下的df

|  id | type |    date    | qty  |
+-----+------+------------+------+
| 001 | CB04 | 2015-01-01 |  700 |
| 155 | AB01 | 2015-01-01 |  500 |
| 300 | AB01 | 2015-01-01 | 1500 |

我使用psycopgdf上传到表格stock
cur.copy_from(df, stock, null='', sep=',')
conn.commit()

遇到了这个错误。
DataError: missing data for column "insert_time"
CONTEXT:  COPY stock, line 1: "001,CB04,2015-01-01,700"

我原本期望使用psycopg的copy_from函数,让我的postgresql表格在插入数据时自动填充行并记录插入时间。
|  id | type |    date    | qty  |     insert_time     |
+-----+------+------------+------+---------------------+
| 001 | CB04 | 2015-01-01 |  700 | 2018-07-25 12:00:00 |
| 155 | AB01 | 2015-01-01 |  500 | 2018-07-25 12:00:00 |
| 300 | AB01 | 2015-01-01 | 1500 | 2018-07-25 12:00:00 |
1个回答

3
你可以像这样指定列: cur.copy_from(df, stock, null='', sep=',', columns=('id', 'type', 'c_date', 'qty'))

2
你是传递一个dataframe还是一个具有read()方法的对象?例如文件或pandas或pyspark dataframe。copy_from(file, table, sep='\t', null='\N', size=8192, columns=None)。file - 从中读取数据的类似文件的对象。它必须具有read()和readline()方法。 - Peter Majko
我正在传递数据框对象,显然它没有任何read()方法。 - Ladenkov Vladislav
确实,我的错。使用copy_from()的最简单(但不是最高效)的解决方案是将数据框保存为csv,然后在python中打开csv进行读取,并将文件对象作为第一个参数传递。然而,pandas有df.to_sql()方法。虽然它不允许指定列 - 在这种情况下,我建议预处理数据框以匹配表格。 - Peter Majko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接