我正在尝试构建一个管理控制面板,汇集了4个不同的电子商务网站。这些站点都具有相同的数据库结构(所有MySQL)。
我在任何订单ID和我放入的网站上都找到404 Not Found。无论我如何混合它,我都无法获得任何记录。永远是404,我不知道为什么。所以我在这里。
我尝试通过创建每个表的基本模型类来完成此操作。然后使用不同的绑定键创建这些基类的继承的clases,这取决于它所适用的DB。这是代码的总结视图 - 如果您需要的话,请告诉我:
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))
class Site2Order(MyOrderClass):
__bind_key__ = 'site2'
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'
}
@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构建的,结构和命名约定都不够整洁。
感谢您的时间。
答案 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'] ='您的绑定名称'
我找到了一种使事情变得简单的方法