香港云主机最佳企业级服务商!

ADSL拨号VPS包含了中国大陆(联通,移动,电信,)

中国香港,国外拨号VPS。

当前位置:云主机 > python >

电信ADSL拨号VPS
联通ADSL拨号VPS
移动ADSL拨号VPS

Python的Flask框架中SQLAlchemy使用时的乱码问题解决


时间:2021-12-08 14:56 作者:admin


一、问题

这两天在学习使用flask + SQLAlchemy 定制一个web查询页面的demo ,在测试时,发现查询到的结果显示乱码 。这里将解决方法记录下。

二、解决思路

1、flask 程序上定位

flask的文档中提到可以通过设置SQLALCHEMY_NATIVE_UNICODE来禁止使用SQLAlchemy默认的Unicode编码。有可能是SQLAlchemy默认的Unicode编码不是UTF-8,抱着这样的想法,在程序中指定了“SQLALCHEMY_NATIVE_UNICODE=False”,执行程序,报错。

flask中还提到“use_native_unicode”为目标编码来指定编码方式,尝试将“db = SQLAlchemy(app)”改为“db = SQLAlchemy(app, use_native_unicode="utf8")”。这回虽然没报错,但还是乱码。

2、mysql/' target='_blank'>mysql 上定位

突然想到有可能是建表的时候,没有指定字符集,使用的是数据库默认的字符集的导致的。继续找了一段时间的如何指定建表时使用字符集的方法,未果。

数据库该不会使用的不是UTF-8吧?抱着这个想法,进入数据库,输入“status”,在输出的信息上显示默认是latin-1。搞了半天,原来问题在这。

MySQL> status--------------mysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1Connection id:     9Current database:   web12306Current user:      root@localhostSSL:          Not in useCurrent pager:     stdoutUsing outfile:     ''Using delimiter:    ;Server version:     5.1.73 Source distributionProtocol version:    10Connection:       Localhost via UNIX socketServer characterset:  utf8Db   characterset:  utf8Client characterset:  latin1Conn. characterset:  latin1UNIX socket:      /var/lib/mysql/mysql.sock

3、解决问题

即然找到了,问题就在mysql 的my.cnf 上增加相关配置,并重启mysql 服务:

# 进入mysql的配置文件目录cd /etc/mysql/# 编辑my.cnf配置文件vim my.cnf# 在文件中的[mysqld]下面增加一行内容character_set_server = utf8# 在[client]和[mysql]下面分别增加一行内容default-character-set = utf8# 保存。然后重启MySQL的服务,设置就生效了service mysqld restart

注:需要注意的是,之前已经存在的数据,在上面修改过后,通过mysql select查询时会是乱码,需要重新导入。

PS:python/' target='_blank'>python下SQLAlchemy真的是super好用,不太了解的童鞋可以尝试一下下面这个MySQL的例子:

#!/usr/bin/env Python# -*- coding: UTF-8 -*-from sqlalchemy.orm import mapper, sessionmaker__author__ = 'tan9le' from sqlalchemy import create_engine, Table, Column, Integer, String, MetaDatafrom sqlalchemy.sql.expression import Castfrom sqlalchemy.ext.compiler import compilesfrom sqlalchemy.dialects.mysql import \    BIGINT, BINARY, BIT, BLOB, BOOLEAN, CHAR, DATE, \    DATETIME, DECIMAL, DECIMAL, DOUBLE, ENUM, FLOAT, INTEGER, \    LONGBLOB, LONGTEXT, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, NCHAR, \    NUMERIC, NVARCHAR, REAL, SET, SMALLINT, TEXT, TIME, TIMESTAMP, \    TINYBLOB, TINYINT, TINYTEXT, VARBINARY, VARCHAR, YEAR#表的属性描述对象metadata = MetaData()userTable = Table(  "wzp_user",metadata,  Column('user_id', Integer, primary_key=True),  Column('user_name', VARCHAR(50), unique=True, nullable=False),  Column('password', VARCHAR(40), nullable=True))#创建数据库连接,MySQLdb连接方式mysql_db = create_engine('mysql://用户名:密码@ip:port/dbname')#创建数据库连接,使用 mysql-connector-python连接方式#mysql_db = create_engine("mysql+mysqlconnector://用户名:密码@ip:port/dbname")#生成表metadata.create_all(mysql_db)#创建一个映射类class User(object):  pass#把表映射到类mapper(User, userTable)#创建了一个自定义了的 Session类Session = sessionmaker()#将创建的数据库连接关联到这个sessionSession.configure(bind=mysql_db)session = Session()def main():  u = User()  #给映射类添加以下必要的属性,因为上面创建表指定这个字段不能为空,且唯一  u.user_name='tan9le测试'  #按照上面创建表的相关代码,这个字段允许为空  u.password='123456'  #在session中添加内容  session.add(u)  #保存数据  session.flush()  #数据库事务的提交,sisson自动过期而不需要关闭  session.commit()  #query() 简单的理解就是select() 的支持 ORM 的替代方法,可以接受任意组合的 class/column 表达式  query = session.query(User)  #列出所有user  print list(query)  #根据主键显示  print query.get(1)  #类似于SQL的where,打印其中的第一个  print query.filter_by(user_name='tan9le测试').first()  u = query.filter_by(user_name='tan9le测试').first()  #修改其密码字段  u.password = '654321'  #提交事务  session.commit()  #打印会出现新密码  print query.get(1).password  #根据id字段排序,打印其中的用户名和密码  for instance in session.query(User).order_by(User.user_id):    print instance.user_name, instance.password  #释放资源  session.close()if __name__ == '__main__':  main()

(责任编辑:admin)






帮助中心
会员注册
找回密码
新闻中心
快捷通道
域名登录面板
虚机登录面板
云主机登录面板
关于我们
关于我们
联系我们
联系方式

售前咨询:17830004266(重庆移动)

企业QQ:383546523

《中华人民共和国工业和信息化部》 编号:ICP备00012341号

Copyright © 2002 -2018 香港云主机 版权所有
声明:香港云主机品牌标志、品牌吉祥物均已注册商标,版权所有,窃用必究

云官方微信

在线客服

  • 企业QQ: 点击这里给我发消息
  • 技术支持:383546523

  • 公司总台电话:17830004266(重庆移动)
  • 售前咨询热线:17830004266(重庆移动)