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

时间:2011-07-29 11:35:23

标签: python sqlalchemy flask flask-sqlalchemy

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

出了什么问题?

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

代码

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

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'

__初始化__。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构建的,结构和命名约定都不够整洁。

感谢您的时间。

2 个答案:

答案 0 :(得分: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(...)。

答案 1 :(得分:0)

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

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