flask中使用SQLAlchemy操作mysql的一些注意事項和坑


一 ImportError: cannot import name 'db'

由於app最后才加載,所以其他文件,比如models.py不能從app.py導入任何變量,

要使用db可以先定義一個,之后再注冊初始化即可:

 

二 The sqlalchemy extension was not registered to the current application

沒有注冊導致的,網上很多方法都不對,應該在程序啟動之前就注冊,不能再

if __name__ == '__main__':里面注冊:

 

只需要調用init_app即可,前提app要配置好數據庫連接屬性:

 

 
        

 

三 No module named 'MySQLdb' flask

安裝pymysql : pip install pymysql

然后修改app配置鏈接即可,加上pymysql:

 

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost:3307/test?charset=utf8'

 

 

四 flask 'User' object is not iterable

sqlalchemy model 定義的對象不能直接轉dict,需要特殊轉化一下

通過列表生成式獲取所有屬性,然后再通過反射獲取所有屬性和value轉化為字典:

columns = [c.key for c in class_mapper(user.__class__).columns]
dict((c, getattr(user, c)) for c in columns)

實際中可以定義一個response類:

from flask import Response, jsonify
from sqlalchemy.orm import class_mapper

# 定義response返回類,自動解析json
class JSONResponse(Response):
    @classmethod
    def force_type(cls, response, environ=None):
        if isinstance(response, dict):  # 判斷返回類型是否是字典(JSON)
            response = jsonify(response)  # 轉換
        if isinstance(response, db.Model):  # 對象,只用db,Model即可轉json
            columns = [c.key for c in class_mapper(response.__class__).columns]
            response = jsonify(dict((c, getattr(response, c)) for c in columns))
        return super().force_type(response, environ)

 

 view中直接返回對象即可:

頁面測試:

ok!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM