3.8 定义第一个模型类以及反向生成
新建一个模块model,用于存储数据库表对应的业务模型,在编写model层的模型时,一定要忘记数据库表,重点要放在业务模型的抽象中来
sqlalchemy 是一个类库,用于根据定义的model反向生成数据库表
Flask_SqlAlchemy 是Flask在sqlalchemy基础上封装的一个组件。提供了更加人性化的API来操作数据库
pipenv 按照
pipenv install flask-sqlalchemy
1.编写模型类
from sqlalchemy import Column,Integer,String
class Book():
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=True)
author = Column(String(30), default="未名")
binding = Column(String(20))
publisher = Column(String(50))
price = Column(String(20))
pages = Column(Integer)
isbn = Column(String(15), nullable=True, unique=True)
summary = Column(String(1000))
image = Column(String(50))
2.将模型映射到数据库中
1.在模型类中引入Flask_SqlAlchemy,并做相关声明
app/models/book.py
from sqlalchemy import Column, Integer, String
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
# 继承db.Model
class Book(db.Model):
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(50), nullable=True)
author = Column(String(30), default="未名")
binding = Column(String(20))
publisher = Column(String(50))
price = Column(String(20))
pages = Column(Integer)
isbn = Column(String(15), nullable=True, unique=True)
summary = Column(String(1000))
image = Column(String(50))
2.在app中插入Flask_SqlAlchemy对象
app/__init__.py
def create_app():
app = Flask(__name__)
app.config.from_object("app.secure")
app.config.from_object("app.settings")
register_blueprint(app)
# 将db插入app
db.init_app(app)
# 创建所有的表
db.create_all()
return app
3.书写配置文件
app/secure.py
...
...
# key-SQLALCHEMY_DATABASE_URI不能随意修改
# URI规则:数据库类型+驱动://账号:密码@host:port/dbname
SQLALCHEMY_DATABASE_URI = "mysql+cymysql://root:root@localhost:3306/fisher"
...
...
cysql驱动需要安装
pipenv install cymysql
上面的操作完成以后启动项目,会报如下错误
/Users/gaowenfeng/.local/share/virtualenvs/fisher-4xlkyzha/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py:794: 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 '
Traceback (most recent call last):
File "/Users/gaowenfeng/project/pycharm/fisher/fisher/fisher.py", line 10, in <module>
app = create_app()
File "/Users/gaowenfeng/project/pycharm/fisher/fisher/app/__init__.py", line 14, in create_app
db.create_all()
File "/Users/gaowenfeng/.local/share/virtualenvs/fisher-4xlkyzha/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 963, in create_all
self._execute_for_all_tables(app, bind, 'create_all')
File "/Users/gaowenfeng/.local/share/virtualenvs/fisher-4xlkyzha/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 940, in _execute_for_all_tables
app = self.get_app(app)
File "/Users/gaowenfeng/.local/share/virtualenvs/fisher-4xlkyzha/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py", line 912, in get_app
'No application found. Either work inside a view function or push'
RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.
Process finished with exit code 1
这是因为在Flask中,不是实例化了app核心对象,其他的代码就可以直接用到。所以在上面第二部create_all()
方法中,应该将app传入
db.create_all(app=app)
通过以上修改后,数据库中成功生成了数据库表
Last updated
Was this helpful?