问题:需要有一个完整的工作示例,将sqlalchemy自动映射到具有多个绑定的应用中的现有数据库。
我想绑定到两个数据库,并有一个自动映射表。我需要这样做,因为我无法控制一个数据库,因此必须不断重写我的模型,并且每次迁移时都可能删除新表。
我喜欢here给出的答案,但我似乎无法在Flask中使其工作(我只能使用sqlalchemy来查询示例)。
我从上面的示例设置的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://chet@localhost/ubuntuweb'
SQLALCHEMY_BINDS = {
'chet': 'postgresql://chet@localhost/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)
答案 0 :(得分:6)
您的代码已
db.Model.metadata.reflect[db.engine]
什么时候应该
db.Model.metadata.reflect(db.engine) # parens not brackets
这应该从堆栈跟踪中非常明显....