我可以在这里找到很多关于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专家 - 这是我目前的限制。我确信我会以错误的方式解决这个问题,但目前正在努力找出正确的方法......
答案 0 :(得分:2)
\
字符串中无需'
个"
个字符。"""
字符串来避免需要转义"
个字符。'
个字符,方法是将其替换为'\''
。传递给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())
答案 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命令,尾随分号(;)是可选的。