Postgres 为允许空值的列抛出无效的输入语法

问题描述 投票:0回答:1

我正在尝试使用 psycopg2 将数据从 csv 文件加载到 postgres 数据库中

这是表架构:

Column               |          Type          | Collation | Nullable | Default 
---------------------+------------------------+-----------+----------+---------
 implementation_type | character varying(25)  |           | not null | 
 file_type           | character varying(7)   |           | not null | 
 loop                | character varying(10)  |           |          | 
 segment_name        | character varying(10)  |           |          | 
 segment_desc        | character varying(255) |           |          | 
 element_name        | character varying(255) |           |          | 
 element_no          | character varying(10)  |           |          | 
 data_type           | character varying(5)   |           |          | 
 requirment          | character(1)           |           |          | 
 repeat              | character varying(3)   |           |          | 
 min                 | integer                |           |          | 
 max                 | integer                |           |          | 
 possible_values     | character varying(255) |           |          |
Error : Error: invalid input syntax for type integer: ""
LINE 16: ...', 'REFERENCE IDENTIFIER', 'REF04', '', 'O', '1', '', '', ''...

它会引发 min 列错误

注:

  • 这是第一个 min 行,其中 min 具有空值。
  • possible_values 先前在某些行中具有空值,但插入时没有任何错误。

这是插入数据的Python代码。

for row in data:
            sql = """
                INSERT INTO segment_data (
                    IMPLEMENTATION_TYPE,
                    FILE_TYPE,
                    Loop,
                    Segment_Name,
                    Segment_Desc,
                    Element_Name,
                    Element_No,
                    Data_Type,
                    Requirment,
                    Repeat,
                    Min,
                    Max,
                    Possible_Values
                ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);
            """
            cursor.execute(sql, tuple(row))
        connection.commit()
database postgresql sql-insert postgresql-14
1个回答
0
投票

您正在尝试将空字符串 '' 插入到整数类型的列中,尤其是“min”列,它在表架构中声明为整数。这就是您遇到问题的原因。对于整数列,PostgreSQL 将空字符串视为无效输入,因为它不会自动将其转换为 NULL 值。

在将数据添加到数据库之前,您应该将 Python 代码中的空字符串更改为 NULL 值以解决此问题。为此,可以使用条件语句。以下是如何更改代码来处理这种情况:

for row in data:
    # Convert empty strings to None for integer columns
    for i in range(len(row)):
        if row[i] == '':
            row[i] = None

    sql = """
        INSERT INTO segment_data (
            IMPLEMENTATION_TYPE,
            FILE_TYPE,
            Loop,
            Segment_Name,
            Segment_Desc,
            Element_Name,
            Element_No,
            Data_Type,
            Requirment,
            Repeat,
            Min,
            Max,
            Possible_Values
        ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);
    """
    cursor.execute(sql, tuple(row))
connection.commit()

希望它有效:)

© www.soinside.com 2019 - 2024. All rights reserved.