Flask-SQLAlchemy的使用_对SQLAlchemy进行了封装和优化:
Flask-SQLAlchemy是一个插件
Flask-SQLAlchemy是对SQLAlchemy进行了一个简单的封装的一个插件,
flask中使用sqlalchemy更加的简单。
1.安装:
pip install flask-sqlalchemy
2.Flask-SQLAlchemy的使用要点:
2.1 数据库连接
数据库初始化不再是通过create_engine。
1. 跟sqlalchemy一样,定义好数据库连接字符串DB_URI。
2. 将这个定义好的数据库连接字符串DB_URI,通过`SQLALCHEMY_DATABASE_URI`这个key名配置到`app.config`中。
代码:app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI
3. 使用`flask_sqlalchemy.SQLAlchemy`这个类定义一个对象,并将`app`传入进去。
代码:db = SQLAlchemy(app)
2.2 创建ORM模型类
之前都是通过Base = declarative_base()来初始化一个基类,然后再继承,在Flask-SQLAlchemy中更加简单了。
1. 还是跟使用sqlalchemy一样,定义模型。现在不再是需要使用`delarative_base`来创建一个基类。而是使用`db.Model`来作为基类。
2. 在模型类中,`Column`、`String`、`Integer`以及`relationship`等,都不需要导入了,直接使用`db`下面相应的属性名就可以了。
3. 在定义模型的时候,可以不写`__tablename__`,那么`flask_sqlalchemy`会默认使用当前的模型的名字转换成小写来作为表的名字,
并且如果这个模型的名字用到了多个单词并且使用了驼峰命名法,那么会在多个单词之间使用下划线来进行连接,
虽然flask_sqlalchemy给我们提供了这个特性,但是不推荐使用。(增强代码可读性,提高团队合作效率)
2.3 将ORM模型映射到数据库表
写完模型类后,要将模型映射到数据库的表中,使用以下代码即可
1. 删除数据库表:db.drop_all()
2. 创建数据库表:db.create_all()
2.4 session的使用
以后session也不需要使用`sessionmaker`来创建了,
直接使用`db.session`就可以了,
操作这个session的时候就跟之前的`sqlalchemy`的`session`是一样一样的。
2.5 添加数据
这时候就可以在数据库中看到已经生成了对应表了
添加数据和之前的没有区别,只是session成为了一个db的属性
2.6 查询数据:
1.单表查询
查询数据不再是之前的session.query方法了,而是将query属性放在了db.Model上,
所以查询就是通过“模型名.query”的方式进行查询了,`query`就跟之前的sqlalchemy中的query方法是一样用的。
2.多表查询
如果查找数据涉及多个模型,只能使用db.session.query(模型名).all() 这种方式
2.7 修改数据:
修改数据和之前的没有区别,只是session成为了一个db的属性
2.8 删除数据:
删除数据跟添加数据和修改数据类似,只不过session是db的一个属性而已
2.9query函数可传递的参数一共有3种:
1. 模型名。指定查找这个模型中所有的属性(对应查询表为全表查询)。
2. 模型中的属性。可以指定只查找某个模型的其中几个属性。
3. 聚合函数(from sqlalchemy import func)。
* func.count:统计行的数量。
* func.avg:求平均值。
* func.max:求最大值。
* func.min:求最小值。
* func.sum:求和。
`func`上,其实没有任何聚合函数。但是因为他底层做了一些魔术,只要mysql中有的聚合函数,都可以通过func调用。
代码示例
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'first_sqlalchemy'
USERNAME = 'root'
PASSWORD = 'root'
DB_URI ="mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
#1.连接数据库
db = SQLAlchemy(app)
#2.创建ORM模型
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
uname = db.Column(db.String(50),nullable=False)
def __repr__(self):
return "<User(uname: %s)>" % self.uname
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(50),nullable=False)
uid = db.Column(db.Integer,db.ForeignKey("user.id"))
author = db.relationship("User",backref="articles")
#3.删除表
db.drop_all()
#4.创建表
db.create_all()
#5.添加数据
user = User(uname='zs')
article = Article(title='wzry')
article.author = user
db.session.add(article)
db.session.commit()
#6.查询数据
# users = User.query.all() #等价于 db.session.query(User).all()
# print(users)
#在query属性之后 可以用 order_by 、 filter、filter_by、group_by、having等方法进行更复杂的单表查询
#若要进行更复杂的多表查询,只能使用db.session.query(User).all() 这种方式
#如 order_by
users = User.query.order_by(User.id.desc()).all()
print(users)
#7.修改数据
user = User.query.filter(User.uname=='ls').first()
user.uname = 'dc'
db.session.commit()
#8.删除数据
user = User.query.filter(User.uname=='dc').first()
db.session.delete(user)
db.session.commit()
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()