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


Posted in Python onNovember 07, 2015

一、问题

这两天在学习使用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 上定位

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

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

mysql> status
--------------
mysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1
Connection id:     9
Current database:   web12306
Current user:      root@localhost
SSL:          Not in use
Current pager:     stdout
Using outfile:     ''
Using delimiter:    ;
Server version:     5.1.73 Source distribution
Protocol version:    10
Connection:       Localhost via UNIX socket
Server characterset:  utf8
Db   characterset:  utf8
Client characterset:  latin1
Conn. characterset:  latin1
UNIX 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下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, MetaData
from sqlalchemy.sql.expression import Cast
from sqlalchemy.ext.compiler import compiles
from 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()
#将创建的数据库连接关联到这个session
Session.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()
Python 相关文章推荐
python使用心得之获得github代码库列表
Jun 25 Python
Python转换HTML到Text纯文本的方法
Jan 15 Python
Python中字符串对齐方法介绍
May 21 Python
菜鸟使用python实现正则检测密码合法性
Jan 05 Python
Python 关于反射和类的特殊成员方法
Sep 14 Python
使用Python进行AES加密和解密的示例代码
Feb 02 Python
详解Python with/as使用说明
Dec 13 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
Oct 14 Python
Python装饰器实现方法及应用场景详解
Mar 26 Python
python实例化对象的具体方法
Jun 17 Python
python3爬虫中异步协程的用法
Jul 10 Python
python基于openpyxl生成excel文件
Dec 23 Python
举例讲解Linux系统下Python调用系统Shell的方法
Nov 07 #Python
使用Python导出Excel图表以及导出为图片的方法
Nov 07 #Python
Windows下为Python安装Matplotlib模块
Nov 06 #Python
python 的列表遍历删除实现代码
Apr 12 #Python
举例讲解Python中的死锁、可重入锁和互斥锁
Nov 05 #Python
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
Nov 05 #Python
python实现将内容分行输出
Nov 05 #Python
You might like
php的header和asp中的redirect比较
2006/10/09 PHP
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
php selectradio和checkbox默认选择的实现方法详解
2013/06/29 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
2019/02/28 PHP
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
Javascript浅谈之引用类型
2013/12/18 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
详解创建自定义的Angular Schematics
2018/06/06 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
用Python实现换行符转换的脚本的教程
2015/04/16 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
django使用JWT保存用户登录信息
2020/04/22 Python
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
数据保密承诺书
2014/06/03 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技