使用pypyodbc访问名称中含空格的表
这个命令运行得很好。
count = conn.cursor().execute("select COUNT(*) FROM Orders;").fetchall()
但是这个命令却报错了。
count = conn.cursor().execute("select COUNT(*) FROM "Summary of Sales"; ").fetchall()
错误是……
Traceback (most recent call last):
File "python-database.py", line 39, in <module>
print(row_count())
File "python-database.py", line 29, in row_count
count = conn.cursor().execute(query).fetchall()
File "/usr/local/lib/python2.7/dist-packages/pypyodbc.py", line 1595, in execute
self.execdirect(query_string)
File "/usr/local/lib/python2.7/dist-packages/pypyodbc.py", line 1621, in execdirect
check_success(self, ret)
File "/usr/local/lib/python2.7/dist-packages/pypyodbc.py", line 985, in check_success
ctrl_err(SQL_HANDLE_STMT, ODBC_obj.stmt_h, ret, ODBC_obj.ansi)
File "/usr/local/lib/python2.7/dist-packages/pypyodbc.py", line 953, in ctrl_err
raise ProgrammingError(state,err_text)
pypyodbc.ProgrammingError: (u'42000', u"[42000] [FreeTDS][SQL Server]Incorrect syntax near 'Summary of Sales'.")
我用SQL分析工具查看了具体的SQL查询,结果是完美的。我甚至把它复制粘贴到数据库的控制台中测试,结果也能正确返回行数。我尝试了各种单引号和双引号的组合。看起来如果我输入的表名是一个单词且不加引号,就能正常工作。如果我输入的表名是多个单词,就必须加引号,但这样就会失败。
希望你们能帮我解答这个问题,这让我项目进展停滞不前,:(
2 个回答
3
当数据库、表格、存储过程或者变量的名字里有空格或者特殊字符时,你可以用方括号把这些名字括起来。
count = conn.cursor().execute("select COUNT(*) FROM [Summary of Sales];").fetchall()
4
你在字符串里面用了双引号,同时又用双引号来表示这个字符串。你可以选择转义这些引号,或者用单引号来表示字符串,像这样:
count = conn.cursor().execute('select COUNT(*) FROM "Summary of Sales"; ').fetchall()
希望这能帮到你。