0

我有一个包含 XML 数据的 S3 文件,我需要将其插入 Aurora PostgreSQL 数据库 (PostgreSQL 11.9) 中的表中。为此,我正在尝试使用 AWS lambda。在 lambda 函数中,我从 S3 对象读取数据并使用 pg8000 尝试将记录插入表中。插入 sql 失败

[ERROR] ProgrammingError: {'S': 'ERROR', 'V': 'ERROR', 'C': '42P18', 'M': 'could not determine data type of parameter $1', 'F': 'postgres.c', 'L': '1432', 'R': 'exec_parse_message'}

例子 -

S3 文件中的 XML

<?xml version="1.0" encoding="UTF-8"?>
<hotels>
   <hotel id="Taj">
      <name>Taj Campton Place</name>
      <location>San Francisco</location>
      <rating>4.5</rating>
      <rooms>
         <room id="100">
            <capacity>3</capacity>
            <comment>Phenomenal service</comment>
         </room>
      </rooms>
      <personnel>
         <person id="3030">
            <name>Pie Co</name>
            <salary currency="USD">80000</salary>
         </person>
      </personnel>
   </hotel>
</hotels>

从 lambda 中的 S3 文件读取数据的代码

    content_object = s3.Object(bucket, key)
    file_content = content_object.get()["Body"].read().decode("utf-8")
    #parsed_xml = ET.fromstring(file_content)
    print(file_content)

插入数据的代码

    conn = pg8000.connect(
        database='lab',
        user='master',
        password='xxxxx',
        host='lab.cluster.us-east-1.rds.amazonaws.com',
        port=8192,
        )
    
    cursor = conn.cursor()
    cursor.execute(
        "INSERT INTO lambda_xml_test (data) values ('%s')", (file_content,)
        )

我也试过


INSERT INTO lambda_xml_test (data) values ('%%')", (file_content,)
INSERT INTO lambda_xml_test (data) values (%s)", (file_content,)

关于如何将 XML 数据插入 PG 中的表的任何建议?

4

1 回答 1

0

问题是 PostgreSQL 服务器不知道您发送的数据类型是xml. 有关更多信息,请参阅文档。解决方案是在 SQL 中放一个CAST来告诉服务器类型。例如:

cursor.execute(
        "INSERT INTO lambda_xml_test (data) values (CAST(%s as xml))",
        (file_content,)
)
于 2021-03-06T10:53:05.100 回答