在Flask中使用SQLAlchemy替换所有行的字符

0 投票
2 回答
935 浏览
提问于 2025-04-18 14:48

我犯了个错误,在一个表单中不小心用了非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()

撰写回答