2016-08-10 3 views
1

Я написал что-то в SQLAlchemy, которые работают нормально, но те же команды workflow/commands кажутся искаженными при выполнении их в Flask. Например, эти типы линий становятся помечены как «неопределенные»:Как использовать SQLAlchemy в флеш-фреймворке

metadata = MetaData(db) 

abc = Table('abc', metadata, autoload=True) 

s = select([abc.name]) 

У меня есть от flask.ext.sqlalchemy импорта SQLAlchemy в верхней части.

Есть ли что-то еще, что мне нужно делать дополнительно или вместо этого?

(Для справки, я бегу это на pythonanywhere)

+0

Вы установили SQLAlchemy в свою виртуальную среду? – SumanKalyan

+0

Такое поведение явно связано с попыткой обработать 'flask_sqlachemy', как будто это была« родная »или« настоящая »sqlalchemy, когда это явно не так. Нигде в документации ['flask_sqlachemy'] (http://flask-sqlalchemy.pocoo.org/2.1/) не используется код, который вы рекомендуете или документируете. Я согласен, что было бы полезно, если бы различия были явно отмечены - я совершил ту же ошибку, когда впервые использовал Flask. – holdenweb

ответ

3

Импорт SQLAlchemy не даст вам прямой доступ к именам внутри этого модуля. Вы также должны знать, что с использованием модуля flask_sqlalchemy (ранее flask.ext.sqlalchemy) используется несколько другой механизм доступа к функциям SQLAlchemy. Это означает, что любая попытка передать ваши текущие знания SQLAlchemy shouold будет проинформирована об исследовании flask_sqlalchemy documentation.

Обычно вы создадите приложение-флягу, а затем передаете это на звонок SQLAlchemyas in this example. Соответствующий код показан ниже.

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' 
db = SQLAlchemy(app) 

Объект db теперь имеет Model, Column и различные типы данных, как атрибуты, так что вы можете определить таблицу/модель следующим образом.

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 
    email = db.Column(db.String(120), unique=True) 

    def __init__(self, username, email): 
     self.username = username 
     self.email = email 

    def __repr__(self): 
     return '<User %r>' % self.username 

Я лично не увлекаюсь данной модели доступа, так как она заставляет меня квалифицировать различные имена внутри db пространства имен, а не просто импортировать их из модуля и их использование неквалифицированных, но это похоже на работу (по крайней мере, для относительно несложных баз данных).

Если вы опытный пользователь SQLAlchemy, вы можете рассмотреть возможность использования стандартных механизмов доступа, хотя это может сделать вас уязвимыми для тонких ошибок из-за непредвиденных взаимодействий потоков/веб-сеансов. Я также слышал, что может быть сложно установить несколько баз данных. У меня нет прямых доказательств этого, поэтому, пожалуйста, расценивайте это как анекдотическое.

+0

Внутренний импорт формы 'flask.ext.foo' [устарели] (http://flask.pocoo.org/docs/0.11/upgrading/#extension-imports), вы должны использовать' flask_foo'. – roy

+0

Спасибо, я изменил ответ – holdenweb

+0

Вам не нужно использовать 'db.', если вам это не нравится, вы все равно можете импортировать из sqlalchemy напрямую. Это просто ярлык. – davidism

 Смежные вопросы

  • Нет связанных вопросов^_^