在 PostgreSQL 表中插入 ARRAY,并在值中使用撇号

Insert ARRAY in PostgreSQL table with apostrophes in values

提问人:Jane 提问时间:1/10/2020 更新时间:6/12/2022 访问量:604

问:

我有一个带有 SQL insert 语句的 Python 脚本,该语句将解析的数据从文件插入到 PostgreSQL 表。如果数据有撇号,则执行失败。详细地:

    <name>RYAZAN'</name>
or
    <name>CHYUL'BYU</name>

当它是一个字符串时,我找到了解决方案 -> 在撇号中添加额外的 ',以便它转换为 INSERT 语句或在 INSERT 语句中。'RYAZAN''''CHYUL''BYU'

但是,如果我的值在列表中(来自 python 脚本),就像 Python 一样,会自动放置双引号而不是单引号。因此,当尝试插入city = ["RYAZAN''", "CHYUL''BYU"]

INSERT INTO City (uuid, name) VALUES (uuid_generate_v4(), unnest(array{city}))

SQL 失败并显示错误

ERROR: column "RYAZAN''.." does not exist

因为 SQL 将双引号读取为列名或其他名称。有没有办法插入包含撇号的值的 ARRAY?

sql python-3.x postgresql 双引号

评论

0赞 Phung Duy Phong 1/10/2020
你能分享 poython 代码吗,这个想法是使用这样特殊的字符将由驱动程序处理,即:pynative.com/......Parameterized Query
1赞 Chris Doyle 1/10/2020
Python 不区分双引号或单引号,它们都只是一个字符串。正如@PhungDuyPhong所说,当你不需要担心你的值中的任何特殊内容时,就会使用参数化/占位符插入

答:

0赞 Jim Jones 1/10/2020 #1

尝试使用 $$ 美元引号字符串

CREATE TEMP TABLE t (f TEXT);
INSERT INTO t VALUES ($$<name>CHYUL'BYU</name>$$),
                     ($$<name>RYAZAN'</name>$$);
SELECT * FROM t;

           f            
------------------------
 <name>CHYUL'BYU</name>
 <name>RYAZAN'</name>
(2 Zeilen)

还有许多其他方法可以转义引号

INSERT INTO t 
VALUES (E'\'foo'),('''bar'''),
       ('"the answer is" -> ''42'''),($$It's "only"" $1.99$$);
SELECT * FROM t;

            f            
-------------------------
 'foo
 'bar'
 "the answer is" -> '42'
 It's "only"" $1.99
(4 Zeilen)

演示:db<>fiddle