【问题标题】:flask sqlalchemy example around existing database围绕现有数据库的烧瓶 sqlalchemy 示例
【发布时间】:2016-01-19 19:46:28
【问题描述】:

问题:需要有完整的工作示例,将 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)

【问题讨论】:

    标签: python flask flask-sqlalchemy


    【解决方案1】:

    你的代码有

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

    应该是什么时候

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

    这从堆栈跟踪中应该很明显......

    【讨论】:

    • 感谢您的帮助。我从帖子中的链接中拔出了硬括号,我的部分问题是为什么答案有括号。它来自stackoverflow.com/questions/17652937/…“将声明性基础绑定到引擎:db.Model.metadata.reflect[db.engine]”
    • @ChetMeinzer 因为答案是错误的。我现在将进行编辑以更正它。
    • @ChetMeinzer(您会注意到投票最多且被接受的答案具有正确的语法!:D)
    • 任何时候寻找的东西,它就在你的眼皮底下。花了几个小时困惑准备回去工作。再次感谢。
    • @ChetMeinzer 很高兴我能帮上忙! :)
    猜你喜欢
    • 2018-10-26
    • 2011-12-16
    • 1970-01-01
    • 2013-08-29
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2012-12-29
    相关资源
    最近更新 更多