2

我可以在这里找到很多关于 PSQL 中的引号的信息,但没有什么能完全适合这个问题。

首先,它是一个杂物。我知道这是一个杂牌,但我认为我坚持下去了(尽管对其他选择持开放态度)

我有一个近乎黑匣子的第三方 linux 设备,我对其访问权限有限,我可以使用 bash、python 和 psql。我没有 psycopg2 或任何其他 pg 库。

我必须使用的数据库使用需要引用的区分大小写的表名(不要问......)

所以,目前我编写 OS shell 命令来获取数据,然后我会根据我的需要摆弄并转换为 JSON

一个简单的例子:

pg_str = "psql -U pword dbname -A -t -c "
sql = "SELECT * FROM \"Addresses\" WHERE id=999"
os_str = pg_str + "\'" + sql + "\'" + ";"
data = string.split(os.popen(os_str).read())

没问题。我并不是说它很漂亮,但它确实有效(记住我不能导入任何数据库库......)

当我在文本字段上有 where 子句时,一切都会出错:

pg_str = "psql -U pword dbname -A -t -c "
sql = "SELECT * FROM \"Addresses\" WHERE town='london'"
os_str = pg_str + "\'" + sql + "\'" + ";"
data = string.split(os.popen(os_str).read())

太多的报价组合无法应付......?

我显然已经尝试了很多转义组合并且已经搜索了几个小时,但是每个解决方案似乎都需要我无法访问的库。

我不是 python 或 psql 专家 - 这是关于我目前的限制。我确信我会以错误的方式去做,但目前在找出正确的方式时被打败了......

4

2 回答 2

2
  1. 无需\转义字符串'中的"字符。
  2. 您可以使用"""字符串来避免需要转义"字符。
  3. 使用 string.replace 来引用'shell 的字符,将它们替换为'\''. '结果字符串在传递给 shell 时需要被非转义字符包围。

使用这些规则,可以使 SQL 字符串易于阅读和编辑:

pg_str = "psql -U pword dbname -A -t -c "
sql = """SELECT * FROM "Addresses" WHERE town='london'"""
sql = sql.replace("'", "'\\''")
os_str = pg_str + "'" + sql + "'" + ";"
data = string.split(os.popen(os_str).read())
于 2012-11-30T01:39:17.797 回答
2

除了@qqx 提供的内容之外:您可以使用美元引用而不是单引号来使其更容易:

pg_str = "psql -U pword dbname -A -t -c "
sql = """'SELECT * FROM "Addresses" WHERE town = $$london$$'"""
data = string.split(os.popen(pg_str + sql).read())

顺便说一句:对于单个 SQL 命令,尾随分号 (;) 是可选的。

于 2012-11-30T01:52:41.440 回答