2

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

怎么了?

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

代码

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

基本模型.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'
}

视图.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 构建的,结构和命名约定不够整洁。

感谢您的时间。

4

2 回答 2

3

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(...) 。

于 2011-08-01T09:07:05.363 回答
1

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

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

于 2018-09-18T07:32:59.460 回答