我正在使用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 :)
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))