Выполнение массового обновления с использованием sqlalchemy

У меня есть список словарей.

 [{'medical_plan_id': 1039481, u'hearing_aids': '', u'clinical_diagnostic_mri': u'20% coinsurance', u'emergency_room': u'20% coinsurance'}, {'medical_plan_id': 1039482, u'hearing_aids': '', u'clinical_diagnostic_mri': u'20% coinsurance', u'emergency_room': u'20% coinsurance'}]

Я могу выполнить массовую вставку, используя приведенный ниже код -

def write_plan_benefittodb(self, benefits_dict):
    try:
        count = benefits_dict.__len__()
        engine = create_engine('postgresql+psycopg2://postgres:postgres@localhost/test_db', use_batch_mode=True)
        conn = engine.connect()
        if count > 0:
            print ("Bulk update to database..")
            conn.execute(MedicalPlanBenefit.__table__.insert(), benefits_dict)
        else:
            print("No rows to update..")
        logging.info("Number of rows inserted. %s \n", benefits_dict.__len__())
    except Exception as e:
        print e
        logging.error("No records were updated due to following error . %s", e)
    finally:
        conn.close()

Я хочу запустить массовую версию Update(), используя мою модель MedicalPlanBenefit на medical_plan_id. Как этого добиться?

Мой класс модели:

class MedicalPlanBenefit(Base):
    __tablename__ = "medical_plan_benefits"

    id = Column(Integer, nullable=False, primary_key=True)
    medical_plan_id = Column(Integer)
    maximum_out_of_pocket_limit_single = Column(String)
    maximum_out_of_pocket_limit_family = Column(String)

Я могу выполнить обновление после жесткой привязки к values(). Я не хочу этого делать, так как количество столбцов составляет 50. Я хочу каким-то образом добиться этого с помощью моего списка диктовок. Любые предложения, пожалуйста.

stmt = MedicalPlanBenefit.__table__.update()\
                    .where(MedicalPlanBenefit.__table__.c.medical_plan_id == bindparam('med_plan_id'))\
                    .values({'emergency_room': bindparam('emergency_room')})
                conn.execute(stmt, benefits_dict)

да .. Мне нужно обновить много столбцов. Размещение каждого столбца в values({ было не очень хорошей идеей. Итак, я пытался, могу ли я положить туда список диктовок.

user1896796 26.10.2018 09:58

В конце концов, «массовое» обновление заканчивается использованием DB-API executemany() под всеми уровнями SQLAlchemy, и, учитывая, что вы используете PostgreSQL и, вероятно, psycopg2, это по сути так же быстро, как вызов execute() в цикле.

Ilja Everilä 26.10.2018 10:05

С другой стороны, SQLAlchemy добавила поддержку execute_batch(). Вы можете включить его, передав use_batch_mode=True в create_engine(). Это может дать некоторые преимущества в производительности.

Ilja Everilä 26.10.2018 10:11

@ IljaEverilä Об использовании кода, который я обновил в своем ответе. Я получаю ошибку InvalidRequestError('This construct does not support multiple parameter sets.',)). Не могли бы вы помочь мне, как мне привязать мой список диктовок к моему values?

user1896796 26.10.2018 10:22

Это дает мне ошибку StatementError("(sqlalchemy.exc.InvalidRequestError) A value is required for bind parameter '_id'",))

user1896796 26.10.2018 10:32

@Ilja .. вы можете помочь, пожалуйста

user1896796 26.10.2018 10:58

В ответ от фургона есть все, что вам нужно. Также прочтите «Вставки, обновления и удаления» из официальной документации.

Ilja Everilä 26.10.2018 11:11

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

user1896796 26.10.2018 12:32

Тебе это не нужно. По умолчанию столбцы связываются своими именами. Вы должны иметь возможность просто опустить свой вызов values(). Вот почему вам нужно использовать альтернативное имя bindparam для параметров, используемых в предложении WHERE и т. д., Как вы это сделали.

Ilja Everilä 26.10.2018 13:26

Аааа, наконец-то понял свои ошибки. Спасибо

user1896796 26.10.2018 13:40
0
11
278
0

Другие вопросы по теме