后端一个重要的点就是与数据库联系,例如网页的注册、登陆,内容的更新等都须要与数据库创建关系。以MySQL
数据库为例,平时咱们会用mysqldb(python 2)
或者pymysql(python 3)
去操做MySQL
数据库,但这种方法也是须要本身编写SQL语句的。如今咱们有了ORM模型,简单来讲,ORM是把数据库中的表抽象成模型,表的列名对应模型的属性,这样咱们能够调用类的属性或方法去得到数据库中的数据。例如假设MySQL
数据库中有一张表名为table1
,使用SELECT * FROM table1 WHERE id=1
获取id
为1
的数据,若是将表table1
映射成ORM模型Table
,那么能够直接使用Table.query.filter(id=1)
,这样操做简单了不少,也很利于理解。html
SQLAlchemy
就是一个这样的ORM,咱们能够直接安装flask_sqlalchemy
来使用。在这以前咱们先在MySQL
中手动创建一个数据库harp
,在创建的时候把charset
设置为utf8
,避免存入中文时变成乱码,而后在配置文件config.py
中填写好数据库的链接信息:python
HOST = "127.0.0.1" PORT = "3306" DB = "harp" USER = "root" PASS = "Your Password" CHARSET = "utf8" DB_URI = "mysql+pymysql://{}:{}@{}:{}/{}?charset={}".format(USER, PASS, HOST, PORT, DB, CHARSET) SQLALCHEMY_DATABASE_URI = DB_URI
SQLAlchemy
依赖mysqldb
或者pymysql
去链接数据库和执行SQL语句,由于咱们用的是python 3
,因此须要在配置信息中指明使用pymysql
,若是是python 2
能够省略,默认是使用mysqldb
。mysql
创建好了数据库,咱们开始建表,首先创建一张用户表,咱们设想它应该有id(做为主键)、用户名、密码、注册时间这些基本的字段,有了ORM,咱们就不用再写SQL去建表了,在项目的主py文件中添加如下代码:sql
from flask_sqlalchemy import SQLAlchemy from datetime import datetime import config app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) class Users(db.Model): __tablename__ = 'users_info' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(32), nullable=False) password = db.Column(db.String(100), nullable=False) register_time = db.Column(db.DateTime, nullable=False, default=datetime.now()) db.create_all()
解读一下这段代码,导入SQLAlchemy
和含有数据库链接信息的config
,实例化一个SQLAlchemy
对象名为db
,其传入的参数为Flask
实例app
。接下来定义了一个User
类,这个类就是ORM中的模型,也就是数据库中的表映射的模型,它须要继承自db.Model
,__tablename__
这个属性就是建表后,数据库生成的表名;而后使用db.Column
来实例化id/username/password/register_time
这几个列,db.Column
的参数描述列的类型、主键等信息,如db.Integer/db.String(32)/db.DateTime
分别表明整形、字符串(最大长度)、时间,primary_key=True
说明该字段为主键,autoincrement=True
表明自增加,nullable
决定是否可为空,default
表明默认值。最后用db.create_all()
来实现建立。咱们暂时不用理解为什么SQLAlchemy
须要传入Flask
实例做为参数,为什么模型要继承自db.Model
,重要的是能够先把想要的表创建起来。数据库
进入数据库,输入desc user_info;
,咱们发现表已经创建好了,其结构图以下:flask
但它如今仍是空的,咱们来试着插入一条语句,将视图函数修改成:后端
@app.route('/') def index(): user = Users(username='Harp', password='123456') db.session.add(user) db.session.commit() return render_template('home.html')
代码实例化一个Users
的对象user
,传入username
和password
,使用db.session.add(user)
将其加入到数据库的session
(能够理解为事务)中,而后使用db.session.commit()
提交。咱们运行程序,而后用浏览器访问,浏览器正常显示告终果,这时再看一眼数据库,发现这条数据已经写入到了数据库:浏览器
查询、修改数据也一样很简单:session
@app.route('/') def index(): user = Users.query.filter(Users.id == 1).first() #查找 print(user.username) user.username = 'Harp1207' #修改 db.session.commit() #修改后需提交 print(user.username) return render_template('home.html')
思考问题:
1.为什么要把模型的操做语句放在视图函数中?(搜索上下文这个概念)
2.数据查找,咱们用的是Model.query
,其实还能够用db.session.query
,二者有何区别?filter和filter_by又有何区别?app