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

时间:2018-03-29 22:32:15

标签: python postgresql sqlalchemy flask-sqlalchemy

我试图通过sqlalchemy在flask中执行原始sql查询。 <{1}}中运行时的原始SQL查询会给出正确的输出。

psql

但是从sqlalchemy执行时 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)

sqlalchemy代码如下:

no such table:'user_event_details'

然后在其中一个路径文件中:

from flask import Flask, jsonify, request
from flask_cors import CORS,cross_origin
from flask_restplus import Resource, Api

#from config import postgresURI
from flask_sqlalchemy import SQLAlchemy
from v3.setup.config import config

# flask application initializing
application = Flask(__name__)

# Cross origin resource sharing instantiation
CORS(application)

# wrapping around rest-plus api
application2 = Api(application, prefix="/api/v1", version='1.0', title='Rest-API', default='Version 1', default_label='API')

# SQLAlchemy binding
postgresURI = config['db']['db_url']
application.config['SQLALCHEMY_BINDS'] = {
                                        'bind_db': postgresURI
                                        }
application.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
application.config['CORS_HEADERS'] = 'Content-Type'

# SQLAlchemy instantiation
db = SQLAlchemy(application)
db.create_all(bind=['bind_db'])
db.create_all()

并将错误显示为:

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)

1 个答案:

答案 0 :(得分:2)

使用Flask-SQLAlchemy,默认引擎由SQLALCHEMY_DATABASE_URI配置。然后,您可以使用SQLALCHEMY_BINDS配置其他引擎,但您的默认引擎是SQLALCHEMY_DATABASE_URI中的引擎。

据推测,在您正在使用的ORM代码中,您正在使用绑定。 (你没有显示工作代码,可能是因为它正在工作......)所以它与Postgres进行了对话。

但是你没有在原始SQL db.engine代码中传递绑定,因此它使用默认数据库。并且您尚未配置默认数据库URI。如果您没有设置任何内容,文档不会解释它的默认值,但是从错误消息中,它显然是sqlite3数据库。这显然不会有你的架构或其他任何有用的东西。

a github issue for Flask-Migrate开始,默认值为sqlite3://,会打开sqlite3非持久:memory:数据库,并且没有警告这样做(可能是因为它对初步的探索性开发很方便吗?)。

有关详细信息,请参阅Multiple Databases with Binds

无论如何,你可以更改你的原始SQL代码以使用绑定,但实际上,最好的解决方案可能就是添加它:

application.config['SQLALCHEMY_DATABASE_URI'] = postgresURI

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

相关问题