Мы используем модель центрального класса для самых разных модулей Python. Эта модель определяется с помощью SQLAlchemy. Все классы наследуются от declarative_base.
Например, определения нашей модели выглядят примерно так:
Base = declarative_base()
class Post(Base):
__tablename__ = 'Posts'
id = Column(INT, primary_key=True, autoincrement=True)
body = Column(TEXT)
timestamp = Column(TIMESTAMP)
user_id = Column(INT, ForeignKey('Users.uid'))
Мы создаем фляжное веб-приложение, в котором используем ту же модель. Мы обнаружили сложную проблему, заключающуюся в том, что flask-sqlalchemy разработана таким образом, что она ожидает, что все классы, используемые в ее модели, будут определены путем передачи активного экземпляра сеанса. Вот пример «правильного» определения модели класса flask-sqalchemy:
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)
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)
Обратите внимание, что приведенный выше пример для flask-sqlalchemy требует уже созданного экземпляра сеанса sql. Это привело нас в ужас, потому что мы совершенно не знаем, как интегрировать нашу модель SqlAlchemy в flask. Мы действительно хотим использовать именно пакет flask-security.
Эта проблема уже поднималась на SO. Вот, например: Как использовать flask- sqlalchemy с существующей моделью sqlalchemy?
Наши требования отличаются от требований тех, кто принял там ответ. В ответе указано, что теряется возможность использовать User.query, но это как раз одна из вещей, которую мы должны сохранить.
Невозможно отказаться от нашего красивого, элегантного определения модели центрального класса в пользу того, что, по-видимому, требует flask-sqlalchemy. Есть ли способ связать нашу модель с объектом SQLAlchemy()? Бонусные баллы за то, что мы получили метод .query() для наших классов, который, по-видимому, требуется flask-security.