使用Python(psycopg2库)在Postgresql中插入INET类型数组的正确方法是什么

使用Python(psycopg2库)在Postgresql中插入INET类型数组的正确方法是什么,python,sql,database,postgresql,psycopg2,Python,Sql,Database,Postgresql,Psycopg2,我在尝试插入到INET类型的数组时一直遇到此错误 psycopg2.DataError:类型inet的输入语法无效:“inet('8.8.8.8')” 对于我尝试过的一些变体: TypeError:在字符串格式化过程中并非所有参数都已转换 测试表: cursor.execute( "CREATE TABLE test( ip_list inet[] );" ) 我尝试过让它工作的一些变体: cursor.execute( "INSERT INTO test( ip_list ) VALUES

我在尝试插入到INET类型的数组时一直遇到此错误

psycopg2.DataError:类型inet的输入语法无效:“inet('8.8.8.8')”

对于我尝试过的一些变体:

TypeError:在字符串格式化过程中并非所有参数都已转换

测试表:

cursor.execute( "CREATE TABLE test( ip_list inet[] );" )
我尝试过让它工作的一些变体:

cursor.execute( "INSERT INTO test( ip_list ) VALUES ( %s );", ( str( { "8.8.8.8" } ) ) )
cursor.execute( "INSERT INTO test( ip_list ) VALUES ( %s );", ( str( { psycopg2.extras.Inet( "8.8.8.8" ) } ) ) )
cursor.execute( "INSERT INTO test( ip_list ) VALUES ( %s );", ( psycopg2.extras.Inet( [ "8.8.8.8", "8.8.4.4" ] ) ) )
psycopg2.extras.Inet([“8.8.8.8”,“8.8.4.4]”)命令生成正确的Inet对象
Inet(['8.8.8.8”,“8.8.4.4]”)

但是,在尝试使用该选项插入时

cursor.execute( "INSERT INTO test( ip_list ) VALUES ( %s );", ( psycopg2.extras.Inet( [ "8.8.8.8", "8.8.4.4" ] ) ) )
它给了我一个错误:
TypeError:'Inet'对象不支持索引

当我尝试在插入via之前将其转换为字符串时:

ursor.execute( "INSERT INTO test( ip_list ) VALUES ( %s );", ( str( psycopg2.extras.Inet( [ "8.8.8.8", "8.8.4.4" ] ) ) ) )

我得到了一个错误
TypeError:不是所有的参数都在字符串格式化过程中转换

我认为问题在于如何格式化字符串和查询的语法

如果按以下方式运行查询,您只需插入一条记录:

INSERT INTO itest( ip_list ) VALUES ( '{ 8.8.8.8 }' );
cur.execute( "INSERT INTO itest( ip_list ) VALUES ( %s );" % ("'{ 200.8.8.200 }'"))
或多个值:

INSERT INTO itest( ip_list ) VALUES ('{ 192.168.2.1, 120.12.25.26, 10.20.30.40, 156.223.122.252 }');

要在python中格式化查询,可以执行以下操作:

INSERT INTO itest( ip_list ) VALUES ( '{ 8.8.8.8 }' );
cur.execute( "INSERT INTO itest( ip_list ) VALUES ( %s );" % ("'{ 200.8.8.200 }'"))

===============================================================

编辑: 对评论的答复:

我只是查看了
Inet()
类,它似乎没有返回正确的数组类型转换(我不确定这里是否缺少任何内容,如果我错了请更正)。然而,作为一种解决方法,我提出了这个

cur = conn.cursor()
cur.execute( "INSERT INTO itest( ip_list ) VALUES ( %s[] );", (Inet([ "8.8.8.8", "8.8.4.4" ]),))
conn.commit()
如您所见,我已手动将数组转换
[]
添加到
inet
类型中


希望有帮助:)如果你有任何疑问,请随时提问

如果要插入数组字段,插入值不应该类似于
数组['8.8.8']::inet[]
?根据,psycopg似乎会将inet数组强制转换为字符串列表。然而,我不太确定它是如何反过来工作的。也许您可以尝试使用
游标。执行(“插入测试(ip_列表)值(%s);”,(['8.8.8'])
进行参数化插入。@Scratch'N'Purr该行给出错误
详细信息:数组值必须以“{”或维度信息开头。
@MeghdeepRay:使用SQLFIDLE,这是可行的。
插入测试(ip_列表)值('s{ 8.8.8.8, 8.8.4.4}');
。您需要的是大括号来表示数组。用引号将其括起来,使其成为一个字符串。这是解释如何使用数组的文档。@shahkalpesh这确实有效,但我需要它来处理参数化输入。如何通过psycopg2库用参数化输入实现这一点?如果我必须输入变量每次有多少IP?@MeghdeepRay请查看我答案的编辑部分。我更新了它。