我犯了一个错误,在使用在 Flask 上运行的 SQLAlchemy 提交到数据库的表单中意外地使用了非 ASCII 字符。基本上,我没有使用 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
列中所有出现的破折号替换为连字符呢?
我可以通过对数据库中的所有条目运行脚本并用错误字符替换条目来解决此问题。
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()
如果表很大,将更新作为单个语句执行并且不检索任何行可能会更有效。这可以这样做:
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)