gpt4 book ai didi

sqlalchemy - 如何将 flask 迁移与其他 declarative_bases 一起使用

转载 作者:行者123 更新时间:2023-12-04 18:35:49 27 4
gpt4 key购买 nike

我正在尝试在 Flask 中实现 python-social-auth。我在尝试同时解释大约 4 个教程和一本完整的 Flask 书的同时解决了很多问题,并且感觉我已经在 Flask-migrate 方面陷入了僵局。

我目前正在使用以下代码创建 python-social-auth 在flask-sqlalchemy 环境中运行所需的表。

from social.apps.flask_app.default import models
models.PSABase.metadata.create_all(db.engine)

现在,他们显然在使用某种形式的自己的 Base,与我的实际 db-object 无关。这反过来导致 Flask-Migrate 完全错过这些表并在迁移中删除它们。现在,显然我可以从每次删除中删除这些 db-drop,但我可以想象它是那些曾经会被遗忘的事情之一,突然间我不再有 OAuth 关系了。

我已经按照 the python-social-auth Flask example 的建议使用了这个解决方案来处理 manage.py-command syncdb 的使用(和修改)。

Flask-Migrate 的作者 Miguel Grinberg 回复 here一个与我的问题非常相似的问题。

我能找到的最接近堆栈溢出的是 this ,但它对我来说并没有对整个事情有太多的了解,而且答案从未被接受(而且我无法让它发挥作用,我已经尝试了几次)

作为引用,这是我的 manage.py:

#!/usr/bin/env python

from flask.ext.script import Server, Manager, Shell
from flask.ext.migrate import Migrate, MigrateCommand


from app import app, db

manager = Manager(app)
manager.add_command('runserver', Server())
manager.add_command('shell', Shell(make_context=lambda: {
'app': app,
'db_session': db.session
}))

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

@manager.command
def syncdb():
from social.apps.flask_app.default import models
models.PSABase.metadata.create_all(db.engine)
db.create_all()

if __name__ == '__main__':
manager.run()

澄清一下,db init/migrate/upgrade 命令仅创建我的用户表(显然是迁移表),而不是社交身份验证表,而 syncdb 命令适用于 python-social-auth 表。

我从 github 响应中了解到 Flask-Migrate 不支持这,但我想知道是否有办法在 PSABase 表中摆弄,以便它们被发送到 Migrate 的 db-object 拾取。

欢迎任何建议。

(另外,第一次发帖。在我终于来这里发帖之前,我觉得我已经做了很多研究并尝试了很多解决方案。如果我遗漏了 SO 指南中的一些明显内容,请不要犹豫在私信中向我指出这一点,我会很高兴地答应)

最佳答案

在 Miguel 的有用回答之后 here我得到了一些新的关键词来研究。我结束了 a helpful github-page其中进一步提到了 Alembic bitbucket site这非常有帮助。

最后,我对我的 Alembic 迁移 env.py 文件执行了此操作:

from sqlalchemy import engine_from_config, pool, MetaData

[...]

# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
from flask import current_app
config.set_main_option('sqlalchemy.url',
current_app.config.get('SQLALCHEMY_DATABASE_URI'))

def combine_metadata(*args):
m = MetaData()
for metadata in args:
for t in metadata.tables.values():
t.tometadata(m)
return m

from social.apps.flask_app.default import models

target_metadata = combine_metadata(
current_app.extensions['migrate'].db.metadata,
models.PSABase.metadata)

这似乎工作得非常完美。

关于sqlalchemy - 如何将 flask 迁移与其他 declarative_bases 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35189891/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com