如何将SQLAlchemy对象的修改提交到数据库表及查看修改内容
问题原因拆解
- 为什么第二次遍历
data没有输出:session.execute()返回的是一次性迭代器,你第一次在翻译循环里已经把它的内容全部读完了,后续再遍历自然没有任何数据。 - 为什么
session.commit()没有生效:你修改的是execute返回的临时行对象,不属于被Session追踪的ORM实体实例,Session感知不到你对这个临时对象做的修改,自然不会同步到数据库。
解决步骤
第一步:先把数据持久化存储到本地,方便预览修改
不要直接用迭代器操作,先把查询结果转成DataFrame,方便后续查看修改内容:
# 查询后直接转成DataFrame,方便预览和处理 import pandas as pd sql_stmt = "SELECT * FROM translate" data_df = pd.read_sql(sql_stmt, engine) # 这里就可以先查看原始数据 print(data_df.head())
第二步:执行翻译,过程中可以随时预览结果
注意googletrans的translate方法返回的是对象,要取.text属性才是翻译后的文本:
for idx, row in data_df.iterrows(): # 翻译Label,目标语言英文,取text属性 label_trans = translator.translate(row['Label'], dest='en').text # 翻译Answer answer_trans = translator.translate(row['Answer'], dest='en').text # 赋值到DataFrame对应位置 data_df.loc[idx, 'Label_Translated'] = label_trans data_df.loc[idx, 'Answer_Translated'] = answer_trans # ******** 这里就可以查看修改后的内容,确认没问题再写入数据库 ******** print(data_df[['Label', 'Label_Translated', 'Answer', 'Answer_Translated']])
第三步:把修改后的数据同步回MySQL
新手推荐直接用pandas的to_sql方法,操作简单不容易出错:
# 把修改后的DataFrame写回translate表,替换原有数据 data_df.to_sql(name='translate', con=engine, if_exists='replace', index=False)
如果不想整表替换,也可以用批量update的写法,性能更高:
with engine.connect() as conn: for _, row in data_df.iterrows(): update_sql = """ UPDATE translate SET Label_Translated = %s, Answer_Translated = %s WHERE Label = %s AND Answer = %s """ conn.execute(update_sql, (row['Label_Translated'], row['Answer_Translated'], row['Label'], row['Answer'])) conn.commit()
额外注意事项
- googletrans默认接口稳定性一般,如果遇到翻译报错可以指定服务域名:
translator = Translator(service_urls=['translate.google.cn']) - 数据量大的话不要逐行翻译,可以批量传值给translate方法提升效率
内容的提问来源于stack exchange,提问作者Karthik S
相关产品推荐
相关产品推荐

