【问题标题】:SQLAlchemy / Flask / Google Cloud SQL -- How deals with UTF8MB4SQLAlchemy / Flask / Google Cloud SQL -- 如何处理 UTF8MB4
【发布时间】:2020-12-07 16:38:53
【问题描述】:

这是我的错误:

pymysql.err.DataError: (1366, "Incorrect string value: '\\xF0\\x9F\\x91\\x87' for column 'text' at row 1")

这是我想在专栏中写的笑脸。所以最初不是由 SQL 管理的。 UTF8 与 UTF8MB4。

在很多主题的帮助下,我尝试了很多方法来更改我的参数。这是我已经设置的:

#1

我的数据库是一个 Google Cloud SQL,所以我通过此字段更改参数:

#2

我尝试直接在 SQL 终端上通过此命令手动强制:

ALTER DATABASE my_database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

#3

我在 SQLALCHEMY URL 的末尾添加了 charset 参数:

SQLALCHEMY_DATABASE_URI = '[URL]?charset=utf8mb4'

#4 我尝试将此参数添加到 FLASK SQLACHEMY :

MYSQL_DATABASE_CHARSET = 'utf8mb4'
MYSQL_CHARSET = 'utf8mb4'

没有用,总是同样的错误。

这是我在 SQL 上的配置:

mysql> SHOW VARIABLES LIKE '%character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql> show variables like "%collation%";
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8_general_ci    |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+

+-------+-------------+--------------------+
| Field | Type        | Collation          |
+-------+-------------+--------------------+
| text  | text        | utf8mb4_unicode_ci |

某些字段仍使用 utf8,例如 character_set_clientcharacter_set_connection。是不是有问题?

如何在不访问my.cnf 的情况下更改此值?

提前感谢您的帮助! !

更多信息

这是表的声明:

@dataclass
class Post(db.Model):

    __tablename__ = 'post'
    __table_args__ = {'extend_existing': True}

[...]

    text: str #dataclass
    text = db.Column(db.Text,unique=False,nullable=True)

[...]

    def __init__(self, id, social_media):
        self.id = id
        self.social_media = social_media

以及代码部分:

data = {'id':'64145', 'message': 'some text... and the smiley : ????', [OTHER_FIELDS]}

new_post = db.session.query(Post).filter(Post.id == data['id']).one_or_none() or Post(
    id = data['id'],
    social_media = 'social'
)

new_post.text = data.get('message') or None

db.session.add(new_post)
db.session.commit()

【问题讨论】:

  • 无法通过 my.cnf 文件更改该标志。如果您想更改标志,您需要查看此cloud.google.com/sql/docs/mysql/flags 以查看支持的标志。然而,这两个 blags 都不受支持。我想知道你想做什么,你想从哪里连接?您尝试使用的代码是什么?
  • 嗨!我的代码在 Google App Engine 上执行。这是由 SQLAlchemy 创建的简单 SQL 请求。数据来自网络,在这个例子中是社交媒体上的评论片段。它运行良好,直到出现笑脸。请找到Complete logs 我将在我的问题中添加更多信息。感谢您的帮助!

标签: python mysql google-cloud-platform flask-sqlalchemy


【解决方案1】:

有趣的事实

我尝试使用proxy 将我的烧瓶应用程序直接从我的本地计算机连接到 SQL 云,它正在工作!

两个网址:

SQLALCHEMY_DATABASE_URI = "mysql+pymysql://robot:__password__@/__database_name__?unix_socket=/cloudsql/__google_app__:__region__:__google_database__?charset=utf8mb4"
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://robot:__password__@localhost/__database_name__?charset=utf8mb4"

好的。所以我就是个笨蛋。

SQLALCHEMY_DATABASE_URI = "mysql+pymysql://robot:__password__@/__database_name__?unix_socket=/cloudsql/__google_app__:__region__:__google_database__?charset=utf8mb4"

必须是:

SQLALCHEMY_DATABASE_URI = "mysql+pymysql://robot:__password__@/__database_name__?unix_socket=/cloudsql/__google_app__:__region__:__google_database__&charset=utf8mb4"

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 2019-05-18
    • 2021-10-09
    • 2021-08-04
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2017-01-08
    • 2019-03-26
    相关资源
    最近更新 更多