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

一 ImportError: cannot import name 'db'

因爲app最後才加載,因此其餘文件,好比models.py不能從app.py導入任何變量,mysql

要使用db能夠先定義一個,以後再註冊初始化便可:sql

 

二 The sqlalchemy extension was not registered to the current application

沒有註冊致使的,網上不少方法都不對,應該在程序啓動以前就註冊,不能再數據庫

if __name__ == '__main__':裏面註冊:

 

只須要調用init_app便可,前提app要配置好數據庫鏈接屬性:

 

 

 

三 No module named 'MySQLdb' flask

安裝pymysql : pip install pymysqljson

而後修改app配置連接便可,加上pymysql:flask

 

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

 

 

四 flask 'User' object is not iterable

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

經過列表生成式獲取全部屬性,而後再經過反射獲取全部屬性和value轉化爲字典:測試

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

實際中能夠定義一個response類:spa

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中直接返回對象便可:code

頁面測試:orm

ok!

相關文章
相關標籤/搜索