Python cursor.execute(语句、参数)sqlalchemy.exc.OperationalError:(sqlite3.OperationalError)没有这样的表

Python cursor.execute(语句、参数)sqlalchemy.exc.OperationalError:(sqlite3.OperationalError)没有这样的表,python,postgresql,sqlalchemy,flask-sqlalchemy,Python,Postgresql,Sqlalchemy,Flask Sqlalchemy,我试图通过flask中的sqlalchemy执行原始sql查询。 在psql中运行原始sql查询时,会给出正确的输出 postgres=# SELECT distinct(user_id) FROM user_event_details WHERE age >=19 AND granular_timestamp >=1493596800 AND granular_timestamp <=1517356800 AND event_name ='IB_TRANS' GR

我试图通过flask中的sqlalchemy执行原始sql查询。 在psql中运行原始sql查询时,会给出正确的输出

    postgres=# SELECT  distinct(user_id) FROM user_event_details WHERE  age >=19 AND granular_timestamp >=1493596800 AND granular_timestamp <=1517356800 AND event_name ='IB_TRANS' GROUP BY user_id;

    user_id 
  ---------
       6206
       5468
       5544
       4349
   (4 rows)
然后在其中一个路由文件中,我有:

raw_sql = text(SELECT  distinct(user_id) FROM user_event_details WHERE  age >=19 AND granular_timestamp >=1493596800 AND granular_timestamp <=1517356800 AND event_name ='IB_TRANS' GROUP BY user_id;)
filtered_users = db.engine.execute(raw_sql)
它给出的误差如下:

cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: user_event_details [SQL: "SELECT  distinct(user_id) FROM user_event_details WHERE age >=19 AND granular_timestamp >=1493596800 AND granular_timestamp <=1517356800 AND event_name ='IB_TRANS'  GROUP BY user_id,event_id;'] (Background on this error at: http://sqlalche.me/e/e3q8)

使用Flask SQLAlchemy,默认引擎由配置。然后可以使用SQLALCHEMY_绑定配置其他引擎,但默认引擎是SQLALCHEMY_数据库_URI中的引擎

大概,在您的ORM代码中,您使用的是绑定。您没有显示工作代码,可能是因为它正在工作…所以它与Postgres对话

但是您没有在原始SQL db.engine代码中传递绑定,因此它使用默认数据库。您还没有配置默认的数据库URI。文档没有解释如果您不设置任何内容,它的默认设置是什么,但是从错误消息来看,它显然是一个sqlite3数据库。这显然不会有你的模式,或者其他有用的东西

从中,默认值似乎是sqlite3://,它打开了一个sqlite3非持久性:内存:数据库,这样做没有任何警告,可能是因为它便于初始探索性开发

有关更多详细信息,请参阅

无论如何,您可以将原始SQL代码更改为也使用绑定,但实际上,最好的解决方案可能只是添加以下内容:

application.config['SQLALCHEMY_DATABASE_URI'] = postgresURI

……甚至可能考虑摆脱绑定,因为你不需要多个数据库连接,它们只会导致混乱。

< >用烧瓶SqLalCyy,默认引擎由。然后可以使用SQLALCHEMY_绑定配置其他引擎,但默认引擎是SQLALCHEMY_数据库_URI中的引擎

大概,在您的ORM代码中,您使用的是绑定。您没有显示工作代码,可能是因为它正在工作…所以它与Postgres对话

但是您没有在原始SQL db.engine代码中传递绑定,因此它使用默认数据库。您还没有配置默认的数据库URI。文档没有解释如果您不设置任何内容,它的默认设置是什么,但是从错误消息来看,它显然是一个sqlite3数据库。这显然不会有你的模式,或者其他有用的东西

从中,默认值似乎是sqlite3://,它打开了一个sqlite3非持久性:内存:数据库,这样做没有任何警告,可能是因为它便于初始探索性开发

有关更多详细信息,请参阅

无论如何,您可以将原始SQL代码更改为也使用绑定,但实际上,最好的解决方案可能只是添加以下内容:

application.config['SQLALCHEMY_DATABASE_URI'] = postgresURI

……甚至可能考虑摆脱绑定,因为你不需要多个数据库连接,它们只会导致混乱。

你似乎不在同一个数据库上运行。在psql中,您正在与Postgres服务器对话。在《炼金术》中,您正在与一个sqlite3数据库交谈。@abarnert idk为什么它显示sqlite3.0错误?我甚至想知道,但我也只有一个数据库,那是在postgres中。是因为db.engine.execute吗?如果是的话,正确的方法应该是什么?如何选择引擎并连接它?这可能就是问题所在,而您还没有向我们展示该代码。@abarnert my bad。您现在已经编辑了它们。您是否有可能在配置文件或环境变量中有任何奇怪的东西,这些都是针对sqlite或其他东西进行原型设计时留下的?您似乎没有针对同一个数据库运行。在psql中,您正在与Postgres服务器对话。在《炼金术》中,您正在与一个sqlite3数据库交谈。@abarnert idk为什么它显示sqlite3.0错误?我甚至想知道,但我也只有一个数据库,那是在postgres中。是因为db.engine.execute吗?如果是的话,正确的方法应该是什么?如何选择引擎并连接它?这可能就是问题所在,而您还没有向我们展示该代码。@abarnert my bad。您现在已经编辑过了。您有没有可能在配置文件或环境变量中有任何奇怪的东西,这些都是针对sqlite或其他东西进行原型设计时遗留下来的?