我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

一、问题

这两天在学习使用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()

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

一、问题 这两天在学习使用flask + SQLAlchemy 定制一个web查询页面的demo ,在测试时,发现查询到的结果显示乱码 。这里将解决方法记录下。 二、解决思路 1、flask 程序上定位 flask的文档中提到可以通过设置S
2022-06-04

Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程

使用Flask-SQLAlchemy管理数据库 Flask-SQLAlchemy是一个Flask扩展,它简化了在Flask应用程序中对SQLAlchemy的使用。SQLAlchemy是一个强大的关系数据库框架,支持一些数据库后端。提供高级的
2022-06-04

在Python程序和Flask框架中使用SQLAlchemy的教程

ORM 江湖 曾几何时,程序员因为惧怕SQL而在开发的时候小心翼翼的写着sql,心中总是少不了恐慌,万一不小心sql语句出错,搞坏了数据库怎么办?又或者为了获取一些数据,什么内外左右连接,函数存储过程等等。毫无疑问,不搞懂这些,怎么都觉得变
2022-06-04

Python转json时出现中文乱码的问题及解决

这篇文章主要介绍了Python转json时出现中文乱码的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-08

解决@ConfigurationProperties注解的使用及乱码问题

这篇文章主要介绍了解决@ConfigurationProperties注解的使用及乱码问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

从源码解析Python的Flask框架中request对象的用法

from flask import request Flask 是一个人气非常高的Python Web框架,笔者也拿它写过一些大大小小的项目,Flask 有一个特性我非常的喜欢,就是无论在什么地方,如果你想要获取当前的request对象,只
2022-06-04

怎么在python中使用os.listdir()方法解决乱码问题

本篇文章给大家分享的是有关怎么在python中使用os.listdir()方法解决乱码问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Python的优点有哪些1、简单易用,与
2023-06-14

Laravel框架使用MongoDB遇到的问题解决

之前说的,我一直是将macOS作为开发平台,直接在macOS系统配置Nginx PHP及MySQL,由于项目需求,需要使用到MongoDB,这篇就是一部在macOS系统下运行Laravel框架使用MongoDB遇到问题解决问题的流水账。   为了不污染正式开发
2015-08-05

spring boot使用i18n时properties文件中文乱码问题的解决方法

国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式。它要求从产品中抽离所有地域语言,国家/地区和文化相关的元素。换言之,应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版
2023-05-30

mysql 使用set names 解决乱码问题的原理

解决乱码的方法,我们经常使用“set names utf8”,那么为什么加上这句代码就可以解决了呢?下面跟着我一起来深入set names utf8的内部执行原理先说MySQL的字符集问题。Windows下可通过修改my.ini内的PHP代
2022-05-17

如何解决Python调用MySQLdb插入中文乱码的问题

这篇文章主要介绍如何解决Python调用MySQLdb插入中文乱码的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQLdb插入中文乱码#!/usr/bin/python# -*- coding: utf-8
2023-06-29

Thymeleaf渲染网页时中文乱码的问题及解决

这篇文章主要介绍了Thymeleaf渲染网页时中文乱码的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-27

python 采集中文乱码问题的完美解决方法

近几日遇到采集某网页的时候大部分网页OK,少部分网页出现乱码的问题,调试了几日,终于发现了是含有一些非法字符造成的..特此记录 1. 在正常情况下..可以用import chardetthischarset = chardet.detect
2022-06-04

php使用urlencode、urldecode解决汉字乱码问题的示例

本文将为大家详细介绍“php使用urlencode、urldecode解决汉字乱码问题的示例”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“php使用urlencode、urldecode解决汉字乱码问题的示例
2023-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录