Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在SQLAlchemy中优化具有多条记录的Update语句_Python_Mysql_Google App Engine_Sqlalchemy - Fatal编程技术网

Python 在SQLAlchemy中优化具有多条记录的Update语句

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

我试图使用SQLAlchemy一次更新许多记录,但我发现它非常慢。有没有最佳的方法来执行此操作

作为参考,我正在对40000条记录进行更新,大约花了1个小时

下面是我正在使用的代码。表_名称指的是加载的表,列是要更新的单个列,对指的是列的主键和新值

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:预期来自表达式”。我将尝试创建一个临时表并从那里插入,谢谢!