如何用声明的基础将烧瓶中的迁移连接起来



我正在使用blask_sqlalchemy中的声明基础。在我的database.py文件中,我有以下内容:

from sqlalchemy import create_engine
# from sqlalchemy.orm import scoped_session, sessionmaker
# from sqlalchemy.ext.declarative import declarative_base
# from flask_sqlalchemy import SQLAlchemy
# engine = create_engine("postgresql://postgres:@localhost/video_comparisons", convert_unicode=True)
# db_session = scoped_session(sessionmaker(autocommit=False,
#                                          autoflush=False,
#                                          bind=engine))
# Base = declarative_base()
# Base.query = db_session.query_property()
# Session = sessionmaker(bind = engine)
# db = SQLAlchemy()
# def init_db():
#     # import all modules here that might define models so that
#     # they will be registered properly on the metadata.  Otherwise
#     # you will have to import them first before calling init_db()
#     import yourapplication.models
#     Base.metadata.create_all(bind=engine)

现在,我的每个模型都从数据库.py导入基本对象。这避免了循环进口。

接下来,我正在尝试将烧瓶迁移模块连接起来,该模块应该这样工作:

db = SQLAlchemy(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)

如您所见,我需要将db传递到迁移构造器中。但是我没有DB对象,因为我使用的是声明性基础,而不是使用DB = SQLAlchemy(app)

创建它。

最好的方法是什么?在文档中,我看不到如何使用此语法将迁移对象连接到数据库。

谢谢路易丝

您必须从database.py :)

导入db对象
import os
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
URI = os.environ.get('SQLALCHEMY_DB_URI')
engine = create_engine(URI, echo=True)
Session = sessionmaker(bind=engine)
Base = declarative_base()
def get_engine():
    return engine
metadata=Base.metadata

用于工厂方法中的使用。

from flask_migrate import Migrate
import src.ext.database as db
migrate = Migrate()
def init_app(app):
    migrate.init_app(app, db)

在app.py中此方法,100%工作...

br:d

关键点是您可能不需要与声明性一起迁移。请参阅此页面。

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:////tmp/test.db')
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()
def init_db():
    # import all modules here that might define models so that
    # they will be registered properly on the metadata.  Otherwise
    # you will have to import them first before calling init_db()
    import yourapplication.models
    Base.metadata.create_all(bind=engine)

最后两行将帮助您建造桌子,如果它们不存在。我认为,迁移库可能不再需要。

#timepass.py
from database import Base, metadata
from sqlalchemy import Table
class Timepass(Base):
    __table__ = Table('timepass', metadata, autoload=True)

#user.py
from project import db
class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(15), unique=True)
    email = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(80))

最新更新