【问题标题】:Flask-SQLAlchemy multiple databases and bindsFlask-SQLAlchemy 多个数据库和绑定
【发布时间】:2016-12-16 12:50:56
【问题描述】:

URI:

SQLALCHEMY_DATABASE_URI = "mssql+pymssql://user:password123@127.0.0.1/DbOne"


SQLALCHEMY_BINDS = {
    "sql_server": "mysql+pymysql://user:password123@127.0.0.1/DbTwo"
}

Models.py

class CrimMappings(db.Model):
    __tablename__ = "crim_mappings"
    id = db.Column(db.Integer, primary_key=True)
    date_mapped = db.Column(db.Date)
    county_id = db.Column(db.Integer)
    state = db.Column(db.String(20))
    county = db.Column(db.String(100))
    AgentID = db.Column(db.String(100), unique=True)
    CollectionID = db.Column(db.String(100))
    ViewID = db.Column(db.String(100))


class LicenseType(db.Model):
    __bind_key__ = "sql_server"
    __table__ = db.Model.metadata.tables["sbm_agents"]

但是它给我一个KeyError 说找不到应该存在的“sbm_agents”表,因为我已指定绑定键以指向 sql_server 绑定。

__init__.py

from os.path import join,dirname,abspath

from flask_admin import Admin
from project.apps.flask_apps.user_app.forms import UserAdminForm
from flask_admin.contrib.sqla import ModelView

from project import app_factory, db
from project.apps.flask_apps.admin_own.views import AdminHome, Utilities
from project.apps.flask_apps.admin_own.models import  CredentCheckMappings, AllAgents, LicenseTypes
from project.apps.flask_apps.admin_own.forms import MasterAgentForm, AgentMappingsModelView, AllLicenseForm
from project.apps.flask_apps.user_app.models import Users


def create_application():
    config_path = join(dirname(abspath(__file__)), "config", "project_config.py")
    app = app_factory(config_path=config_path)
    admin = Admin(app, template_mode="bootstrap3", base_template="base_templates/admin_base.html",
              index_view=AdminHome())
    with app.app_context():
        db.create_all()
        db.Model.metadata.reflect(db.engine)
        admin.add_view(MasterAgentForm(AllAgents, db.session))
        admin.add_view(UserAdminForm(Users, db.session))
        admin.add_view(Utilities(name="Utilities", endpoint="utilities"))
        admin.add_view(AgentMappingsModelView(CredentCheckMappings, db.session))
        admin.add_view(AllLicenseForm(LicenseTypes, db.session))
    return app

application = create_application()


if __name__ == "__main__":
    application.run(host="0.0.0.0", port=5000, debug=True)

我在这里错过了什么? 我试过这个: flask sqlalchemy example around existing database

但我得到了KeyError 有什么变化或我错过了一步吗?

编辑:

对于想知道我是如何解决这个问题的人。 我直接去了 SqlAlchemy 并做了这个

from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.automap import automap_base
from urllib.parse import quote_plus

engine = create_engine("mssql+pyodbc:///?odbc_connect="+ quote_plus("DRIVER={FreeTDS};SERVER=172.1.1.1;PORT=1433;DATABASE=YourDB;UID=user;PWD=Password"))
metadata = MetaData(engine)
Session = scoped_session(sessionmaker(bind=engine))

LicenseType= Table("sbm_agents", metadata, autoload=True)

那样我不会反映整个数据库,只选择反映某些表。因为事实证明反映整个数据库很慢。

虽然这种方法有点困难,因为你必须配置FREETDS,但它的可行性一开始有点乏味和混乱

【问题讨论】:

    标签: python flask flask-sqlalchemy


    【解决方案1】:

    使用db.reflect() 代替db.Model.metadata.reflect(db.engine)

    【讨论】:

    • 我仍然不让我...我不知道为什么,但每当我在LicenseType 模型上执行db.Model.metadata.tables.keys() 时,我仍然会从默认的URI 中获得keys尽管已经指定了绑定键。我通过完全绕过flask-sqlalchemy并直接进入sqlalchemy来解决这个问题
    猜你喜欢
    • 2021-01-20
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多