Python 在SQLAlchemy中优化具有多条记录的Update语句
我试图使用SQLAlchemy一次更新许多记录,但我发现它非常慢。有没有最佳的方法来执行此操作 作为参考,我正在对40000条记录进行更新,大约花了1个小时 下面是我正在使用的代码。表_名称指的是加载的表,列是要更新的单个列,对指的是列的主键和新值Python 在SQLAlchemy中优化具有多条记录的Update语句,python,mysql,google-app-engine,sqlalchemy,Python,Mysql,Google App Engine,Sqlalchemy,我试图使用SQLAlchemy一次更新许多记录,但我发现它非常慢。有没有最佳的方法来执行此操作 作为参考,我正在对40000条记录进行更新,大约花了1个小时 下面是我正在使用的代码。表_名称指的是加载的表,列是要更新的单个列,对指的是列的主键和新值 def update_records(table_name, column, pairs): table = Table(table_name, db.MetaData, autoload=True, autoload_with=d
def update_records(table_name, column, pairs):
table = Table(table_name, db.MetaData, autoload=True,
autoload_with=db.engine)
conn = db.engine.connect()
values = []
for id, value in pairs:
values.append({'row_id': id, 'match_value': str(value)})
stmt = table.update().where(table.c.id == bindparam('row_id')).values({column: bindparam('match_value')})
conn.execute(stmt, values)
将参数列表传递给
execute()
实际上会发出40k个UPDATE
语句,这将带来大量开销。解决方案是增加每个查询的行数。对于MySQL,这意味着插入临时表,然后执行更新:
# assuming temp table already created
conn.execute(temp_table.insert().values(values))
conn.execute(table.update().values({column: temp_table.c.match_value})
.where(table.c.id == temp_table.c.row_id))
或者,您也可以使用
INSERT。。。在重复键更新时
避免创建临时表,但SQLAlchemy本机不支持该操作,因此需要使用自定义编译结构(例如)。将参数列表传递给execute()
实际上会发出40k个UPDATE
语句,这将带来大量开销。解决方案是增加每个查询的行数。对于MySQL,这意味着插入临时表,然后执行更新:
# assuming temp table already created
conn.execute(temp_table.insert().values(values))
conn.execute(table.update().values({column: temp_table.c.match_value})
.where(table.c.id == temp_table.c.row_id))
或者,您也可以使用
INSERT。。。在重复键更新上
以避免创建临时表,但SQLAlchemy本机不支持该操作,因此您需要为此使用自定义编译的构造(例如)。我尝试使用您提供的链接中的Upsert语句,但遇到了一些问题。我将conn.execute(stmt,values)更新为conn.execute(Upsert(stmt)),并获得以下异常“sqlalchemy.exc.ArgumentError:预期来自表达式”。我将尝试创建一个临时表并从那里插入,谢谢!我试图使用您提供的链接中的Upsert语句,但遇到了一些问题。我将conn.execute(stmt,values)更新为conn.execute(Upsert(stmt)),并获得以下异常“sqlalchemy.exc.ArgumentError:预期来自表达式”。我将尝试创建一个临时表并从那里插入,谢谢!