插入带有字符串的数组时,postgresql 查询会出错
Posted
技术标签:
【中文标题】插入带有字符串的数组时,postgresql 查询会出错【英文标题】:postgresql queries give error when inserting arrays with strings 【发布时间】:2016-08-10 11:30:33 【问题描述】:我有一个简单的查询,打算在我的 postgresql 9.5 数据库的表中插入一行:
client.query('INSERT INTO "GRIDs" (idname, status, playerid, playerready) VALUES (\'' + gameRoomID + '\', 0, ARRAY[\'\',\'\',\'\',\'\'], ARRAY[0,0,0,0]);', function(err, data)
if(err)
throw new Error('Error inserting game room ID ' + gameRoomID);
;
);
但是,由于未知原因,字符串数组 (ARRAY[\'\',\'\',\'\',\'\']) 会导致错误,因为如果我将其从查询中删除相应的 playerid 列,查询工作正常。我尝试了以下变体,结果都相同: ARRAY["\'\'","\'\'","\'\'","\'\'"] (用双引号将每个值括起来) ARRAY["","","",""](只用双引号) ARRAY[,,,](只是空的) 以及花括号的各种类似符号,但即使是编号数组,这些符号似乎也很烦人,所以我倾向于避免使用这些符号。
我做错了什么?
【问题讨论】:
错误信息是什么,playerid
列的数据类型是什么?
手动查询转义始终是灾难的根源。您应该依赖库中的自动查询格式。查看pg-promise,它可以自动格式化任何东西(包括混合内容)的数组。
【参考方案1】:
如果这些是字符串数组,你必须声明你的类型。
也可以使用美元引号或双引号。
ARRAY[''''::text, '''''', ...]
请注意,您的数据库驱动程序应该为您执行此转义操作。自己做这件事是解决 sql 注入问题的好方法。
【讨论】:
非常感谢。美元引用它(导致 ARRAY[$$\'\'$$,$$\'\'$$,$$\'\'$$,$$\'\'$$])解决了这个问题。由于表已经使用 pgAdmin 创建,并且列的数据类型已经是字符变量 [],因此没有必要为每个值分配类型。以上是关于插入带有字符串的数组时,postgresql 查询会出错的主要内容,如果未能解决你的问题,请参考以下文章
如何在 postgresql 中使用带有数组列的 GIN 索引?
Postgresql:搜索jsonb对象数组时如何使用动态值?