封尘网

让学习成为一种习惯!

python3中使用flask_sqlalchemy的几个问题

在 Flask 中,为了简化配置和操作,我们使用的 ORM 框架是 Flask-SQLAlchemy,这个 Flask 扩展封装了 SQLAlchemy 框架。在 Flask-SQLAlchemy 中,数据库使用 URL 指定。可以让我们操作数据跟操作对象是一样的,非常方便。因为一个表就抽象成一个类,一条数据就抽象成该类的一个对象表。

Python版本:3.5.2
本文下面的异常、错误信息并不适合所有版本,可能会跟操作系统、Python的版本有关。

安装:

pip3 install flask-sqlalchemy

异常信息1:

init.py:819: UserWarning: SQLALCHEMY_DATABASE_URI not set. Defaulting to “sqlite:///:memory:“. ‘SQLALCHEMY_DATABASE_URI not set. Defaulting to ‘

这里因为没有配置默认的变量:SQLALCHEMY_DATABASE_URI

像下面这样添加一个变量名即可:

USERNAME = 'dba' 
PASSWORD = '123456' 
HOST = '10.0.10.110' 
PORT = '3306' 
DATABASE = 'test' 

DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME,PASSWORD,HOST,PORT,DATABASE) 
SQLALCHEMY_DATABASE_URI = DB_URI 
SQLALCHEMY_TRACK_MODIFICATIONS = True

异常信息2:由于使用了错误的python mysql插件导致:

ImportError: No module named ‘MySQLdb’

代码跟上面差不多就是在Python3中使用了Python2里的mysql-db连接插件;

DB_URI = 'mysql+mysqldb://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME,PASSWORD,HOST,PORT,DATABASE)

这里是刚切换到Python3里可能会经常遇到的一个问题。因为在Python3版本中已经有发生变化 。

异常信息3:

FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future. Set it to True or False to suppress this warning. ‘SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and ‘

这个就是在程序app.py文件里初始化db配置时存在的语句先后问题。

代码如下:[以下的代码是会报上面的异常信息的]

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy   #导入模块 
import config     #把上面的配置文件导入进来 

app = Flask(__name__) 
db = SQLAlchemy(app)        #初始化一个对象 
app.config.from_object(config) 

db.create_all() 
正确的代码写法:一个先后的问题。

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy   #导入模块 
import config 

app = Flask(__name__) 
app.config.from_object(config) 
db = SQLAlchemy(app)    #初始化一个对象 

db.create_all()

异常信息4:

AttributeError: ‘NoneType’ object has no attribute ‘encoding’

说明这个属性编码不能被识别,那是因为配置文件中使用了’utf-8’;而mysql中不认这个’-‘。

DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf-8'.format(USERNAME,PASSWORD,HOST,PORT,DATABASE)

应该修改成’utf8’即可。

如果你的数据库配置不是单独使用一个配置文件配置,而是写在manager.py文件中可以这样设置:

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 
import pymysql 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI']="mysql+pymysql://dba:123456@10.0.10.110:3306/memory" 
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 
db = SQLAlchemy(app)

提醒:本文最后更新于 683 天前,文中所描述的信息可能已发生改变,请谨慎使用。