2

我正在从 MS SQL db 表中读取 csv 文件导出并尝试将数据插入 PostgreSQL (Aurora Serverless) db。当我在 PostgreSQL 数据库中创建等效表时,我使用了我在网上找到的列类型映射来将 datetime (MS SQL) 映射到 timestamp(3) (PostgreSQL) 类型。但是,当我尝试将记录插入 Postgres db 时,我收到了该错误:

Batch entry 0 INSERT INTO my_table VALUES (\'10000002\', \'2020-11-22 00:00:00\')\nRETURNING * was aborted: 
ERROR: column "Date" is of type timestamp without time zone but expression is of type character varying\n 
Hint: You will need to rewrite or cast the expression.\n  Position: 37  Call getNextException to see other errors in the batch.

我的 MS SQL 表架构:

ID: varchar(20)
Date: datetime

csv 文件包含:

10000002, 2020-11-22 00:00:00
10000003, 2020-11-22 00:00:00
...

PostgreSQL 表模式/创建语句:

CREATE table my_table
(
    "ID"                      varchar(20)  not null,
    "Date"                  timestamp(3)
);

在错误消息中,提示说我可能必须转换表达式,但我不确定我应该如何做到这一点,或者这是否是我情况下的最佳解决方案。

我正在使用以下脚本从 csv 文件加载数据并将其推送到 PostgreSQL 数据库:

import boto3
import csv
rds_client = boto3.client('rds-data')

def batch_execute_statement(sql, sql_parameter_sets, transaction_id=None):
    parameters = {
        'secretArn': db_credentials_secrets_store_arn,
        'database': database_name,
        'resourceArn': db_cluster_arn,
        'sql': sql,
        'parameterSets': sql_parameter_sets
    }
    if transaction_id is not None:
        parameters['transactionId'] = transaction_id
    response = rds_client.batch_execute_statement(**parameters)
    return response

transaction = rds_client.begin_transaction(
    secretArn=db_credentials_secrets_store_arn,
    resourceArn=db_cluster_arn,
    database=database_name)


sql = "INSERT INTO rigs_latest VALUES (:ID, :Date;"
parameter_set = []


with open('data.csv', 'r') as file:
    reader = csv.DictReader(file, delimiter=',')
    for row in reader:
        entry = [
            {'name': 'ID', 'value': {'stringValue': row['ID']}},
            {'name': 'Date', 'value': {'stringValue': row['Date']}}
        ]
        parameter_set.append(entry)

response = batch_execute_statement(
    sql, parameter_set, transaction['transactionId'])

更新

如果我使用查询编辑器插入一条记录,例如insert into rigs_latest values (10000002, '2020-11-22 00:00:00');它可以正常工作

在此处输入图像描述

这表明代码本身有问题

4

1 回答 1

2

在花了更多时间研究之后,我发现我们可以typeHintentry. parameter_set根据文档typeHint允许我们指定参数是时间的,TIMESTAMP如下所示:

...
    entry = [
        {'name': 'ID', 'value': {'stringValue': row['ID']}},
        {'name': 'Date','typeHint': 'TIMESTAMP', 'value': {'stringValue': row['Date']}}
    ]
    parameter_set.append(entry)
...

我想这有助于解释器弄清楚我们希望Date参数是类型TIMESTAMP

于 2020-11-25T08:48:50.250 回答