如何使用 Python boto3 客户端在 Aurora PostgreSQL 数据库中为 'int' 列类型插入 'NULL' 值

How to insert 'NULL' values for 'int' column tupes in Aurora PostgreSQL db using Python boto3 client

我有一个 CSV 文件(MS SQL 服务器 table 导出),我想将其导入 Aurora Serverless PostgreSQL 数据库 table。我对 CSV 文件进行了基本预处理,将其中的所有 NULL 值(即 '')替换为 "NULL"。该文件看起来像这样:

CSV 文件:

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

PostgreSQL table 具有以下模式:

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 以接受 int 等类型的 NULL 值?

仔细阅读 boto3 documentation,我发现我们可以使用 isNull 值设置为 True,以防字段为 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)