2015-10-20 61 views
4

問題:需要將具有多重綁定的應用程序中的sqlalchemy自動映射到現有數據庫的完整工作示例。在現有數據庫周圍燒瓶sqlalchemy示例

我想綁定到兩個數據庫,並有一個自動映射表。我需要這樣做,因爲我無法控制一個數據庫,因此必須不斷重新編寫模型,並且每次遷移時都可能會刪除新表。

我喜歡給出的答案here,但我似乎無法讓它在Flask中工作(我可以使用sqlalchemy來查詢每個例子)。

我在

EDIT設置從上面的結果的例子的model.py我把線

db.Model.metadata.reflect[db.engine] 

從另一個交,並且它應該是db.Model.metadata.reflect (db.engine) 非常簡單的解決方案

這裏是我的model.py

from app import db 
from sqlalchemy.orm import relationship 

db.Model.metadata.reflect[db.engine]#change to (db.engine) 

class Buildings(db.Model): 
    __table__ = db.Model.metadata.tables['test'] 
    __bind_key__ = 'chet' 
    def __repr__(self): 
     return self.test1 

.... other models from sqlalchemy uri here... 

我得到這個

>>> from app import db, models 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "app/__init__.py", line 69, in <module> 
    from app import views, models 
    File "app/views.py", line 1, in <module> 
    from app import app,models, db 
    File "app/models.py", line 163, in <module> 
    db.Model.metadata.reflect[db.engine] 
TypeError: 'instancemethod' object has no attribute '__getitem__' 

這裏是我的config.py

SQLALCHEMY_DATABASE_URI = 'postgresql://[email protected]/ubuntuweb' 

SQLALCHEMY_BINDS = { 
    'chet':  'postgresql://[email protected]/warehouse', 
} 

這裏是我的init.py文件

from flask import Flask 
from flask_bootstrap import Bootstrap 
from flask.ext.sqlalchemy import SQLAlchemy 
from flask.ext.admin import Admin, BaseView, expose 
from flask.ext.script import Manager 
from flask.ext.migrate import Migrate, MigrateCommand 
from flask.ext.login import LoginManager, UserMixin, login_required 

app = Flask(__name__) 

app.config['UPLOAD_FOLDER'] = 'app/static' 
app.config.from_object('config') 
db = SQLAlchemy(app) 
migrate = Migrate(app, db) 
manager = Manager(app) 
manager.add_command('db', MigrateCommand) 

Bootstrap(app) 

from app import views, models 
admin = Admin(app) 

回答

6

你的代碼有

db.Model.metadata.reflect[db.engine] 

當它應該是

db.Model.metadata.reflect(db.engine) # parens not brackets 

這應該是從堆棧跟蹤很明顯....

+0

感謝您的幫助。我將硬括號從我帖子中的鏈接中拉出來,我的問題的一部分就是爲什麼答案有括號。它來自http://stackoverflow.com/questions/17652937/how-to-build-a-flask-application-around-an-already-existing-database「將聲明基礎綁定到引擎:db.Model.metadata .reflect [db.engine]「 –

+0

@ChetMeinzer,因爲答案是錯誤的。我將編輯現在糾正它。 –

+0

@ChetMeinzer(你會注意到,頂級投票和接受的答案有正確的語法!:D) –