фляга-sqlalchemy - меняйте ленивых в разных ситуациях - PullRequest
0 голосов
/ 10 сентября 2018

Взять пример из документа

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    addresses = db.relationship('Address', lazy='dynamic',
        backref=db.backref('person', lazy='select'))

Мы можем установить для параметра lazy значение , когда мы создаем модели . Но я не нашел никакого документа, показывающего, как изменить его после того, как он был создан.

В большинстве моих ситуаций, таких как

user = User.query.first()
addresses = user.addresses.filter(is_del=0).all()

один-ко-многим или

wallet = user.wallet

, то есть модель «один к одному», я просто устанавливаю lazy на dynamic или выбираю , чтобы позволить модели получать только те данные, которые мне нужны.

Однако в последнее время я хочу экспортировать данные в базу данных, используя интерфейсную страницу администратора.

user_list = UserModel.query.all()
for x in user_list:
    item = {
        "ID": x.id if x.id else ''
    }
    if 'basic' in fields or is_all_field == 1:
        ex_item = {
            "Email": x.base.account,
            "Full Name": x.base.full_name,
            "Display Name": x.display_name if x.display_name else '',
            "Phone Number": x.base.phone_number if x.base.phone_number else '',
            "Status": status_map(x.is_sharer,x.is_block,x.status_id)
            "Register Time": x.create_date.strftime('%Y-%m-%d %H:%M:%S') if x.create_date else ''
        }
        item = {**item, **ex_item}
    if ......
    ........

Если я продолжу использовать select и dynamic, как lazy . Это будет очень очень медленно, потому что каждый цикл родительского запроса будет обращаться к базе данных каждый раз, когда он использует подзапрос.

Я проверяю скорость между , выбираю и , соединяем , используя одно поле, например "Full Name": x.base.full_name, для экспорта всех пользовательских данных. Выберите получил 53 с и присоединился получил 0,02 с.

Есть ли способ изменить параметр lazy , не изменяя исходную модель?

1 Ответ

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

В соответствии с документацией вы можете использовать options, чтобы определить тип загрузки, который вы хотите. Я верю, что это заменит значение по умолчанию, определенное в ваших отношениях

Полезные ссылки

сборных грузов

Выбор грузов

Ленивая нагрузка

...