使用Python(psycopg2库)在Postgresql中插入INET类型数组的正确方法是什么
我在尝试插入到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
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请查看我答案的编辑部分。我更新了它。