Python OS PostgreSQL和引号

时间:2012-11-30 01:05:14

标签: python bash postgresql psql

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

首先它是一个kludge。我知道这是一个kludge,但我认为我坚持它(尽管开放其他替代品)

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

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

所以,目前我编写OS shell命令来获取数据,然后我根据需要转换为JSON并将其转换为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专家 - 这是我目前的限制。我确信我会以错误的方式解决这个问题,但目前正在努力找出正确的方法......

2 个答案:

答案 0 :(得分:2)

  1. \字符串中无需'"个字符。
  2. 您可以使用"""字符串来避免需要转义"个字符。
  3. 使用string.replace引用shell的'个字符,方法是将其替换为'\''。传递给shell时,生成的字符串需要被未转义的'字符包围。
  4. 使用这些规则,可以使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())
    

答案 1 :(得分:2)

@qqx provided之外:您可以使用dollar-quoting代替单引号来简化:

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命令,尾随分号(;)是可选的。