Flask使用__bind_key__在多个相同的数据库中继承了表类

问题描述 投票:1回答:2

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

What's Going Wrong?

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

Code

我尝试通过创建每个表的基本模型类来做到这一点。然后使用不同的绑定键创建这些基类的继承的clases,这取决于它所适用的DB。这是代码的总结视图 - 如果您需要的话,请告诉我:

base models.朋友

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.朋友

class Site2Order(MyOrderClass):
    __bind_key__ = 'site2'

__init__.朋友

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.朋友

@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构建,并且结构和命名约定不够整洁。

感谢您的时间。

python sqlalchemy flask flask-sqlalchemy
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版本,如果正确定义了__bind_key__,则可以为不同的数据库使用简单的MyModel.query.filter(...)。


0
投票

db.Model.metadata.tables ['your model name']。info ['bind_key'] ='your bind_name'

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

© www.soinside.com 2019 - 2024. All rights reserved.