我想使用alembic,尤其是它的自动生成功能。 但是,我目前无法在基于SQLite的应用程序上使用Alembic。
这是我初始化应用程序的简化步骤(在test.py中):
from sqlalchemy import MetaData
from sqlalchemy.ext.declarative import declarative_base
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from flask_sqlalchemy_session import flask_scoped_session
# my existing tables:
from application.usermodel import User
from application.bookmodel import Course, Calendar, TemplateSeason
print('creating metadata obj')
metadata = MetaData()
print('creating Base')
Base = declarative_base(metadata=metadata)
print('creating db')
db = SQLAlchemy()
print('creating app')
app = Flask(__name__, instance_relative_config=False)
app.config.from_object('config.Config')
db.app = app
db.init_app(app)
engine = create_engine('sqlite:///new.sqlite3')
session_factory = sessionmaker(bind=engine)
session = flask_scoped_session(session_factory, app)
Base.query = session.query_property()
with app.app_context():
# Create tables for our models
db.create_all()
db.metadata.create_all(bind=engine)
print(db.metadata)
app.run()
这是上面的示例表定义:
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
password = Column(String(128), nullable=False)
last_login = Column(DateTime)
is_superuser = Column(Boolean, nullable=False)
username = Column(String(150), nullable=False)
在这里,我认为这是我相关的Alembic设置,以便访问我的表。
(尽管在alembic current
命令中,它抱怨找不到test
。)
import test
from test import Base
target_metadata = Base.metadata
我认为我的问题是,尽管我尝试绑定到引擎,但数据库元数据仍显示bind=None
?
另一个问题是,我不确信自己实际上已经为表创建了元数据-即使表已“注册”到Base或有效地单个Metadata对象,我也无法确定-那么它们应该如何使用收集这些信息?
欢迎进行任何澄清,因为来自SQLalchemy和Alembic的文档尚不清楚。