Python 使用pyodbc访问名称中包含空格的表

Python 使用pyodbc访问名称中包含空格的表,python,sql,sql-server,pypyodbc,Python,Sql,Sql Server,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",

这个命令很好用

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'.")
回溯(最近一次呼叫最后一次):
文件“python database.py”,第39行,在
打印(行计数())
第29行“python database.py”文件
count=conn.cursor().execute(query).fetchall()
文件“/usr/local/lib/python2.7/dist packages/pyodbc.py”,执行中的第1595行
self.execdirect(查询字符串)
execdirect中的文件“/usr/local/lib/python2.7/dist packages/pyodbc.py”,第1621行
检查是否成功(自我、ret)
文件“/usr/local/lib/python2.7/dist packages/pyodbc.py”,第985行,检查成功
ctrl\u err(SQL\u HANDLE\u STMT、ODBC\u obj.STMT\u h、ret、ODBC\u obj.ansi)
文件“/usr/local/lib/python2.7/dist packages/pyodbc.py”,第953行,在ctrl\u err中
引发编程错误(状态、错误文本)
PYODBC.ProgrammingError:(u'42000',u“[42000][FreeTDS][SQL Server]在“销售摘要”附近的语法不正确。)
我使用了一个SQL分析器来查看确切的SQL查询,它非常完美,我甚至将它粘贴到一个控制台会话中,与数据库一起进行测试,它会毫无疑问地返回行数。我尝试了单引号和双引号的所有不同组合。看起来,如果一个表名是一个没有引号的单词,那么它就可以正常工作。如果我试图输入一个由多个单词组成的表名,我必须使用引号,但失败了


希望你们能对此有所了解,它停止了我在它的轨道上的项目:(

您在字符串内部使用双引号,并且还用于分隔字符串。请转义引号,或者使用单引号分隔字符串,如下所示:

count = conn.cursor().execute('select COUNT(*) FROM "Summary of Sales"; ').fetchall()

希望有帮助。

当数据库、表、存储过程或变量名的名称包含空格或特殊字符时,可以用方括号括住名称

count = conn.cursor().execute("select COUNT(*) FROM [Summary of Sales];").fetchall()

将对象名称括在括号中
[]
也会起作用,IMO更具可读性。