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!

相关文章
相关标签/搜索