在 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)