class table(Base): engine = create_engine(url) metadata = MetaData(bind=engine) __table__ = Table('table', metadata, autoload = True) session = scoped_session(sessionmaker(bind=engine, autoflush=True, expire_on_commit=True, autocommit=False))
данные которые в нее пишу так
update_count = 0 for item in data.items(): update_count +=1 param_row = tables.table.session.query(tables.table).filter(tables.table.uid == item[0]).first() param_row.param_1 = item[1][1] param_row.param_2 = item[1][0] # tables.table.session.query(tables.table).filter_by(uid = item[0]).with_lockmode("update").update({'param_1':item[1][1], 'param_2':item[1][0]}) # как вариант записи которым пробывал # tables.table.session.query(tables.table).filter(tables.table.uid == item[0]).with_lockmode("update").update({'param_1':item[1][1], 'param_2':item[1][0]}) # как вариант записи if update_count > 99: tables.table.commit() update_count = 0
как пишу на сервер ошибка двух типов:
выбивает в этом месте:
param_row = tables.table.session.query(tables.table).filter(tables.table.uid == item).first()
либо на закоммиченных вариантах, тоесть при самом апдейте до коммита в базу не доходит.
sqlalchemy.exc.OperationalError: (OperationalError) (1213, ‘Deadlock found when trying to get lock; try restarting transaction’)
sqlalchemy.exc.OperationalError: (OperationalError) (1205, ‘Lock wait timeout exceeded; try restarting transaction’
пробывал по разному и с помощью MySQLdb
update_count = 0 for item in data.items(): update_count += 1 cur.execute(""" INSERT INTO table (uid, params_1, _params_2) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE params_1 = VALUES(params_1), params_2 = VALUES(params_2) ; """, (item[0], item[1][0], item[1][1])) if update_count > 99: con.commit() update_count = 0
Пробывал коммитить чаще не могу понять в чем проблема.