0

我有一个 CSV 文件(MS SQL 服务器表导出),我想将它导入 Aurora Serverless PostgreSQL 数据库表。我对 CSV 文件进行了基本预处理,以将其中的所有NULL值(即'')替换为"NULL". 该文件如下所示:

CSV 文件:

ID,DRAW_WORKS
10000002,NULL
10000005,NULL
10000004,FLEXRIG3
10000003,FLEXRIG3

PostgreSQL 表具有以下架构:

CREATE TABLE T_RIG_ACTIVITY_STATUS_DATE (
    ID varchar(20) NOT NULL,
    DRAW_WORKS_RATING int NULL
)

我用来读取和插入 CSV 文件的代码如下:

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 T_RIG_ACTIVITY_STATUS_DATE VALUES (:ID, :DRAW_WORKS);'
parameter_set = []


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

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

但是,返回的错误表明存在类型不匹配:

Invalid type for parameter parameterSets[0][5].value.longValue, 
value: NULL, type: <class 'str'>, valid types: <class 'int'>"

有没有办法将 Aurora 配置为接受NULL诸如 的类型的值int

4

1 回答 1

1

仔细阅读boto3 文档,我发现我们可以使用isNullvalue set toTrue以防字段为NULL. 下面的代码片段显示了如何向null数据库插入值:

...
entry = [
            {'name': 'ID','value': {'stringValue': row['ID']}}
        ]
    
if row['DRAW_WORKS'] == 'NULL':
                entry.append({'name': 'DRAW_WORKS', 'value': {'isNull': True}})
            else:
                entry.append({'name': 'DRAW_WORKS_RATING', 'value': {'longValue': int(row['DRAW_WORKS'])}})
parameter_set.append(entry)

于 2020-11-25T14:54:53.917 回答