SQLite加入OperationalError

时间:2016-11-17 19:12:39

标签: sqlite sqlalchemy

使用join运行此SQL代码时,出现错误:

    ss=  'select project.id from  project_list pl  '
    ss+= ' LEFT JOIN project p ON pl.project_id = p.id  '
    ss+= ' LEFT JOIN table t   ON pl.table_id   = t.id  '

错误是:

OperationalError: (sqlite3.OperationalError) near "table": 
syntax error [SQL: 'select project.id from  project_list pl  
 LEFT JOIN project p ON pl.project_id = p.id   LEFT JOIN table t 
ON pl.table_id   = t.id  ']

这不是错误来自SQL语句看起来正确的地方。 这是使用SQL Alchemy。

1 个答案:

答案 0 :(得分:1)

如果您有一个名为table的表,则需要引用它,否则会导致解析错误。这将有效:

ss=  'select project.id from  project_list pl  '
ss+= ' LEFT JOIN project p ON pl.project_id = p.id  '
ss+= ' LEFT JOIN "table" t   ON pl.table_id   = t.id  '

这是因为table是SQL中的保留字(例如create table my_tablealter table mytable等),并且SQL解析器是原始的,或者规范要求它表现出来这样(PostgreSQL有同样的问题)。

我强烈建议您将table重命名为其他内容,如果可以的话,或者您将要进入一个受伤的世界。在SQLAlchemy或其他数据库库的其他场景中,当您不是手工制作SQL时,它们可能不够智能,无法自动引用表名。如果从SQLite迁移到另一个数据库,这也会让您头疼。它可能会让人们在阅读代码时感到困惑。