【问题标题】:How to actually set utf-8 encoding in SQLAlchemy / Postgres in Python如何在 Python 的 SQLAlchemy / Postgres 中实际设置 utf-8 编码
【发布时间】:2020-01-25 00:05:55
【问题描述】:

我正在使用 Flask 和 Postgresql 数据库(使用 SQLAlchemy)开发一个 Web 应用程序。它工作得很好。除了一个小问题:所有文本数据都采用某种不是 utf-8 的编码(至少我认为不是)。

我环顾四周寻找任何可能的解决方案,这是我尝试过的:

  • 在项目中的每个 Python 文件中都包含这一行:
# -*- coding: utf-8 -*-
  • 这样设置引擎:
def __init__(self):
        self.engine = sql.create_engine(os.environ['DATABASE_URL'], encoding='utf8')
        self.conn = self.engine.connect()
        self.metadata = sql.MetaData()

还有这些先前项目的一些变体,例如 client_encoding='utf8 而不是 encoding='utf8。我也尝试了这些解决方案:

例如,这是我的选择函数之一(但问题发生在每个选择/插入/更新函数中):

def get_produtos(self, id):
        produtos = sql.Table('produtos', self.metadata, autoload=True,
                             autoload_with=self.engine).columns
        parceiros = sql.Table('parceiros', self.metadata, autoload=True,
                              autoload_with=self.engine).columns
        q = sql.select([produtos.id, produtos.nome, parceiros.nome_parceiro,
                        produtos.valor, produtos.qtd_desconto,
                        parceiros.id_parceiro])
        q = q.where(produtos.id == id)
        return self.conn.execute(q).fetchall()

程序没有引发任何异常,只是数据带有错误的编码。

我的数据库中的数据是这样的:https://i.imgur.com/8BA1i3N.png

这就是数据在我的应用中的显示方式:https://i.imgur.com/NZBxFtl.png

【问题讨论】:

  • 您能否edit 提出从 psql 控制台添加此命令的输出的问题:\l <name of your database(或 psql --list | grep '<name of your database>'。这将向我们展示您的数据库的默认设置。
  • 应用程序在 Heroku 上运行,所以我只能访问数据库本身。运行您所说的登录我的数据库的命令(不确定这样做是否正确),我得到了这个:i.imgur.com/S1ZQxOT.png
  • 一个公然的mojibake 案例。您正确地怀疑 所有文本数据都采用某种编码,而不是 utf-8'Se‡Æo Eletr“nicos' 绝对是这个结果:'Seção Eletrônicos'.encode('cp850').decode('cp1252')
  • @JosefZ 这个问题实际上已经解决了一段时间,但感谢您的回答,因为它可能对其他人有所帮助
  • @MarcosSombra 好吧。然后,你应该answer the question yoursef(最后接受答案(See this page 解释为什么这很重要。)

标签: python postgresql flask utf-8 sqlalchemy


【解决方案1】:

正如 JosefZ 所说,这是一个Mojibake 案例。 尤其是出现这个问题是因为有些条目是通过shell插入的,没有编码,导致这种不一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 2018-02-17
    • 2013-01-18
    • 2017-01-02
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2017-05-16
    相关资源
    最近更新 更多