2016-12-16 21 views
1

URI:フラスコSQLAlchemyの複数のデータベースと結合し

SQLALCHEMY_DATABASE_URI = "mssql+pymssql://user:[email protected]/DbOne" 


SQLALCHEMY_BINDS = { 
    "sql_server": "mysql+pymysql://user:[email protected]/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"] 

それはsbm_agents 'テーブルが見つからないと言ってくれKeyErrorをスローしかし、それを私は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を設定するが、最初の

答えて

0

利用db.reflect()代わりのdb.Model.metadata.reflect(db.engine)でほんの少し退屈で混乱してなんとかしなければならないので、このアプローチは少し厳しいですが。

+0

私はまだ私に言わせません...理由はわかりませんが、 'LicenseType'モデルで' db.Model.metadata.tables.keys() 'を実行するたびに' keys'を取得しますバインドキーを指定したにもかかわらずデフォルトの 'URI'を返します。フラスコのsqlalchemyを完全にバイパスして、これを直接sqlalchemyに渡しました –

関連する問題