Flask наследовал классы таблиц в нескольких идентичных базах данных, используя __bind_key__ - PullRequest
1 голос
/ 29 июля 2011

Я пытаюсь создать панель управления администратора, которая объединяет 4 различных сайта электронной коммерции.Все сайты имеют одинаковую структуру базы данных (все MySQL).

Что происходит не так?

Я получаю 404 Not Found для любого идентификатора заказа и сайта, который я вставляю. Независимо от того, как я их смешиваю, яне может получить какую-либо запись, чтобы придумать.Всегда 404, и я понятия не имею, почему.И вот я здесь.

Код

Я попытался сделать это, создав базовые классы моделей для каждой таблицы.Затем создание унаследованных предложений тех базовых классов с другим ключом привязки, зависящим от БД, для которой он предназначен.Это краткое представление кода - если вам нужно больше, чем это, дайте мне знать:

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 и имеют менее аккуратные структуры и соглашения об именах.

Спасибо, что уделили время.

Ответы [ 2 ]

3 голосов
/ 01 августа 2011

В настоящее время проблема с 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 Выпуск простого MyModel.query.filter (...)возможно для разных баз данных, если вы правильно определили __bind_key__.

0 голосов
/ 18 сентября 2018

db.Model.metadata.tables ['название вашей модели']. Info ['bind_key'] = 'ваше bind_name'

Я нашел способ упростить процесс

...