如何解决SQLAlchemy / Flask / Google Cloud SQL-如何处理UTF8MB4
这是我的错误:
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_client
或character_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()
解决方法
有趣的事实
我尝试使用proxy将flask应用程序直接从本地计算机连接到SQL Cloud,并且可以正常工作!
两个网址:
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"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。