2

私は4つの異なるeコマースサイトをまとめる管理コントロールパネルを構築しようとしています。すべてのサイトは同一のデータベース構造を持っています(すべてMySQL)。

何がうまくいかないのですか?

入力した注文IDとサイトで404NotFoundが発生します。どのように混合しても、レコードを取得できません。常に404で、理由はわかりません。だからここにいます。

コード

すべてのテーブルの基本モデルクラスを作成して、これを実行しようとしました。次に、対象の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'

__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で構築されており、構造や命名規則が整然としていません。

お時間をいただきありがとうございます。

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ステートメントを使用できるように、自分で行うか、コンテキストマネージャーを作成する必要があります。

モデルがすべてのデータベースで同一である場合、これは、すべてのデータベースに対して1つのクラスのみを持ち、bind_keyを残して、特別なバインドセッションオブジェクトでそれらをクエリする方法でもあります。

編集:Flask-SQLAlchemy 0.15を使用して__bind_key__を適切に定義した場合、さまざまなデータベースで単純なMyModel.query.filter(...)をリリースできます。

于 2011-08-01T09:07:05.363 に答える
1

db.Model.metadata.tables['モデル名']。info['bind_key']='バインド名'

私は物事を簡単にする方法を見つけました

于 2018-09-18T07:32:59.460 に答える