亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python的Flask框架中SQLAlchemy使用時的亂碼問題解決

系統 2066 0

一、問題

這兩天在學習使用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()

          


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久久久久午夜精品 | 综合久久久久久中文字幕 | 一级一级一级毛片 | 深夜视频在线 | 久久久久国产精品免费免费不卡 | 日韩国产片 | 国产一级在线免费观看 | 欧美色图一区二区 | 色综合天天干 | 国产69精品久久久久999小说 | 九九热在线精品 | 中文字幕最新中文字幕中文字幕 | 国产伦久视频免费观看视频 | 亚洲一区日韩二区欧美三区 | 久久精品在线观看 | 国产日韩欧美精品在线 | 国产欧美一区二区三区视频 | 亚洲日日夜夜 | 色综合久久综合欧美综合图片 | 日本爱爱视频 | 日本欧美强乱视频在线 | 一级毛片日韩a欧美 | 国产第一福利 | 99青青| 欧美激情一区二区三区视频 | 久久影院一区 | 亚洲色图国产精品 | 91精品国产乱码在线观看 | 国产欧美亚洲精品第3页在线 | 中文字幕日本不卡 | 欧美另类亚洲一区二区 | 色综合中文字幕 | 99精品欧美一区二区三区 | 国产全黄一级毛片 | 亚欧成人毛片一区二区三区四区 | 亚洲第一综合色 | 91精品视频网 | 国产精品国产亚洲精品不卡 | 国产激情一区二区三区在线观看 | 久久国产影视免费精品 | 亚洲视频99|