Почему SQLAlchemy ведет себя таким образом?

Итак, есть наимельчайший проект на Flask + SQLAlchemy.

App.py
from flask import Flask, render_template
from flask.ext.sqlalchemy import SQLAlchemy as SA

SQLALCHEMY_DATABASE_URI = 'mysql+mysqlconnector://user:pass@localhost:3306/app_db'
app = Flask(__name__)
db = SA(app)

from sqlalchemy import create_engine
engine = create_engine(SQLALCHEMY_DATABASE_URI)
db.metadata.reflect(engine)   

from Classes import *

@app.route('/')
def get_index():
    Users.query.all()
    return 'Hello World!'

if __name__ == '__main__':
    app.run(debug=True)
    pass


Classes.py
from App import db
class Users(db.Model):
    __table__ = db.metadata.tables['users']


SQLAlchemy явно правильно считывает метаданные из имеющейся базы на MySQL, однако при попытке обратиться к данным в Users.query.all() сетует на отсутствие такой таблицы, хотя за 10 строк до этого успешно считала структуру этой таблицы.

sqlalchemy.exc.OperationalError: (OperationalError) no such table: users 'SELECT users."UserId" AS "users_UserId", users."UserLogin" AS "users_UserLogin", users."UserPassword" AS "users_UserPassword", users."UserMail" AS "users_UserMail", users."UserType" AS "users_UserType" \nFROM users' ()


В дополнение к этому, если копнуть чуть вверх по стеку ошибок, видно что context.engine == Engine(sqlite://).
  • Вопрос задан
  • 3736 просмотров
Решения вопроса 1
@sormon
инженер-программист =)
Нужно немножко внимательнее читать документацию к ext.sqlalcmemy

Вы используете обертку, но при этом engine объявляете где-то в стороне от нее.
Да и еще URI к базе указываете в стороне от app.
Надо так:

from flask import Flask, render_template
from flask.ext.sqlalchemy import SQLAlchemy as SA

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+mysqlconnector://user:pass@localhost:3306/app_db'
db = SA(app)

from sqlalchemy import create_engine

db.metadata.reflect(db.engine)
from Classes import *

@app.route('/')
def get_index():
    Users.query.all()
    return 'Hello World!'

if __name__ == '__main__':
    app.run(debug=True)
    pass


И тогда все будет нормально работать
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы