【问题标题】:Flask inherited classes of tables in multiple identical databases using __bind_key__Flask 使用 __bind_key__ 继承多个相同数据库中的表类
【发布时间】:2011-10-15 21:29:18
【问题描述】:

我正在尝试构建一个管理控制面板,将 4 个不同的电子商务网站汇集在一起​​。这些网站都有相同的数据库结构(都是 MySQL)。

怎么了?

我在输入的任何订单 ID 和站点上都出现 404 Not Found。无论我如何混合它,我都无法获得任何记录。总是404,我不知道为什么。所以我在这里。

代码

我试图通过为每个表创建基本模型类来做到这一点。然后使用依赖于它的数据库的不同绑定键创建这些基类的继承类。这是代码的摘要视图 - 如果您需要更多信息,请告诉我:

basemodels.py

​​>
MyOrderClass(db.Model):
    __tablename__ = 'messytablename'
    id = db.Column('order_id', db.Integer, primary_key=True)
    order_total = db.Column(db.Float)
    order_status = db.Column(db.String(1))

site2models.py

​​>
class Site2Order(MyOrderClass):
    __bind_key__ = 'site2'

__init__.py

​​>
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:pass@localhost/site'
app.config['SQLALCHEMY_BINDS'] = {
    'site1':'mysql://user:pass@localhost/site1',
    'site2':'mysql://user:pass@localhost/site2',
    'site3':'mysql://user:pass@localhost/site3',
    'site4':'mysql://user:pass@localhost/site4'
}

views.py

​​>
@app.route('/order/<site>/<orderid>')
def show_order(site, orderid):
    if site == 'site1':
        orderObject = Site1Order
    if site == 'site2':
        orderObject = Site2Order
    if site == 'site3':
        orderObject = Site3Order
    if site == 'site4':
        orderObject = Site4Order

    order = orderObject.query.get(orderid)
    return render_template('order.html', order=order)

原始网站是用 PHP 构建的,结构和命名约定不够整洁。

感谢您的宝贵时间。

【问题讨论】:

  • 有没有办法改变一个模型的 bind_key 而不是定义不同的模型

标签: python sqlalchemy flask flask-sqlalchemy


【解决方案1】:

目前使用 SQLALCHEMY_BINDS 的问题是它仅用于 create_all() 或 drop_all() 之类的操作 - 您需要为此更改会话绑定:

db.session.bind = db.get_engine(app, 'site2')

正在进行改变这一点的工作,但它还没有放在后备箱中。

你的代码可能是这样的:

db.session.bind = db.get_engine(app, orderObject.__bind_key__)
order = orderObject.query.get(orderid)

但请记住,这会更改全局会话并且不会重置它,您需要自己执行此操作或编写上下文管理器,以便您可以为此使用 with 语句。

如果您的模型在所有数据库中都相同,这也可能是所有数据库只有一个类的方法,请保留 bind_key 并使用特殊的绑定会话对象查询它们。

编辑:在 Flask-SQLAlchemy 0.15 Release 中,如果您正确定义了 __bind_key__,则可以为不同的数据库创建一个简单的 MyModel.query.filter(...)。

【讨论】:

  • 使用 Flask-SQLAlchemy 0.15 版本,如果您正确定义了 _bind_key_,则可以为不同的数据库创建一个简单的 MyModel.query.filter(...)。
【解决方案2】:

db.Model.metadata.tables['你的模型名称'].info['bind_key'] = '你的绑定名称'

我找到了一种让事情变得简单的方法

【讨论】:

  • 您使用的是哪个版本的 flask_sqlalchemy?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多