在Flask中使用SQLAlchemy替换所有行的字符
我犯了个错误,在一个表单中不小心用了非ASCII字符,然后把它提交到了一个用SQLAlchemy和Flask搭建的数据库里。简单来说,我本来应该用ASCII的连字符-
,结果用了Unicode的短破折号–
。现在我想回去把数据库里所有的短破折号都替换成连字符。
假设我有一个用户表,想要修改的列叫occupation
。我能找到数据库里哪些条目有这个无效字符,因为当我运行:
User.query.get(id)
如果用户有无效的ASCII字符,它会返回
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in position 167: ordinal not in range(128)
那么我该怎么做才能把数据库中occupation
列里所有的短破折号都替换成连字符呢?
2 个回答
0
如果表格很大,使用一个语句来更新数据,而不去获取任何行,可能会更有效率。可以这样做:
import sqlalchemy as sa
...
with Session.begin() as s:
update = (
sa.update(User)
.where(User.occupation.contains('\N{en dash}'))
.values(occupation=sa.func.replace(User.occupation, '\N{en dash}', '-'))
)
s.execute(update)
0
我通过对数据库中的所有记录运行一个脚本,找出那些有问题的字符并替换掉它们,成功解决了这个问题。
from user.models import *
for u in User.query.all():
# \u2013 is unicode for en-dash
if u"\u2013" in u.occupation:
# replace with normal hyphen
u.occupation = u.occupation.replace(u"\u2013", "-")
db.session.commit()