加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

flask_sqlalchemy

发布时间:2020-12-20 10:49:58 所属栏目:Python 来源:网络整理
导读:?flask_sqlalchemy 1.????? flask_sqlalchemy 1.1.??? 简介 flask_sqlalchemy:用来操作数据库的扩展包 好处: 不用编写sql语句 官网介绍: Flask-SQLAlchemy is an extension for?Flask?that adds support for?SQLAlchemy?to your application. It aims to si

?flask_sqlalchemy

1.????? flask_sqlalchemy

1.1.??? 简介

flask_sqlalchemy:用来操作数据库的扩展包

好处: 不用编写sql语句

官网介绍:

Flask-SQLAlchemy is an extension for?Flask?that adds support for?SQLAlchemy?to your application. It aims to simplify using SQLAlchemy with Flask by providing useful defaults and extra helpers that make it easier to accomplish common tasks.

它是针对sqlalchemy的一个扩展,旨在更简单方便的使用sqlalchemy。

?

2.????? 使用

2.1.??? 安装及导入

pip install flask_sqlalchemy

依赖于pymysql

pip install pymysql

?

2.2.??? 配置与链接数据库

2.2.1.?? 设置数据库的链接配置信息

有两种方式

# 创建app并修改配置项

app = Flask(__name__)? # 实例化一个Flask
# 连接数据库配置: SQLALCHEMY_DATABASE_URI。
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:[email?protected]:8889/movie"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True
app.config["SECRET_KEY"] = "1e3df42bbfe146c785f422611d6e7429"

?

在config类中声明然后加载

app = Flask(__name__)

app.config.from_object(Config)

?

关于具体配置项的含义见后序章节

?

2.2.2.?? 创建SQLALchemy对象,关联app

有两种方式

There are two usage modes which work very similarly. One is binding the instance to a very specific Flask application:

app = Flask(__name__)

db = SQLAlchemy(app)

The second possibility is to create the object once and configure the application later to support it:

db = SQLAlchemy()

?

def create_app():

??? app = Flask(__name__)

??? db.init_app(app)

??? return app

推荐后一种,它会麻烦一些,但db可以作为一个全局变量被引用,这有利于拆分和组织模块。

?

2.2.3.?? 编写模型类,属性信息,类必须继承自db.Model

简单来说就是声明表,通常会写在models.py中,示例如下:

from . import db

class Role(db.Model):
??? __tablename__ = "roles" #指定表名
??? #设置id为主键
???
id = db.Column(db.Integer,primary_key=True)
??? #设置角色名,唯一的
???
name = db.Column(db.String(64),unique=True)

默认的表名称是类名的小写,如果需要指定表名使用__tablename__

?

?

2.2.4.?? 创建表/删除表

前文只是声明了表,并没有创建表。

# 初次创建表/删除表

def table_init():
??? pass
???
app = create_app()
??? handle_db1(app) # db配置
???
from app.models import Role,User
??? with app.app_context():
??????? # 删除所有的表
??????? #db.drop_all()
??????? # 创建所有表
???????
db.create_all()

if __name__ == ‘__main__‘:
??? table_init()

释义:

一般情况下只会创建一次表,所以这部分功能被单列;

需要在create_all之前导入models,在导入中表类会注册到sqlalchemy类中,create_all负责创建;

建议使用上下文,否则容易抛出异常。

?

2.3.??? 操作数据库(使用方法)

document: https://flask-sqlalchemy.palletsprojects.com/en/2.x/queries/

删除所有的表:db.drop_all()

创建所有的表:"db.create_all()

添加数据:db.session.add(obj)

添加多个数据:db.session.add_all([obj1,obj2])

提交:db.session.commit()

删除:db.session.delete(obj)

回滚:db.session.rollback()

?

2.3.1.?? insert

Inserting data into the database is a three step process:

Create the Python object

Add it to the session

Commit the session

?

The session here is not the Flask session,but the Flask-SQLAlchemy one. It is essentially a beefed up version of a database transaction. This is how it works:

>>> from yourapp import User

>>> me = User(‘admin‘, ‘[email?protected]‘)

>>> db.session.add(me)

>>> db.session.commit()

?

2.3.2.?? delete

r = db.session.query(Role).first()
db.session.delete(r)

db.session.commit()

?

2.3.3.?? update

# update
r = db.session.query(User).first()
print(r)
r.email = ‘[email?protected]‘
print(db.session.query(User).first())
db.session.commit()
print(db.session.query(User).first())

?

2.3.4.?? 常用查询

查询所有用户数据

User.query.all()

?

查询有多少个用户

User.query.count()

?

查询第1个用户

User.query.first()

User.query.get(1)?? # 根据id查询

?

查询id为4的用户[3种方式]

User.query.get(4)

User.query.filter_by(id=4).all()?? # 简单查询? 使用关键字实参的形式来设置字段名

User.query.filter(User.id == 4).all()? # 复杂查询? 使用恒等式等其他形式来设置条件

?

查询名字结尾字符为g的所有用户[开始 / 包含]

User.query.filter(User.name.endswith("g")).all()

User.query.filter(User.name.startswith("w")).all()

User.query.filter(User.name.contains("n")).all()

User.query.filter(User.name.like("%n%g")).all()? 模糊查询

?

查询名字和邮箱都以li开头的所有用户[2种方式]

User.query.filter(User.name.startswith("li"),User.email.startswith("li")).all()

?

from sqlalchemy import and_

User.query.filter(and_(User.name.startswith("li"),User.email.startswith("li"))).all()

?

查询age是25 或者 `email`以`itheima.com`结尾的所有用户

from sqlalchemy import or_

User.query.filter(or_(User.age == 25,User.email.endswith("itheima.com"))).all()

?

查询名字不等于wang的所有用户[2种方式]

from sqlalchemy import not_

User.query.filter(not_(User.name == "wang")).all()

User.query.filter(User.name != "wang").all()

?

查询id为[1,3,5,7,9]的用户

User.query.filter(User.id.in_([1,9])).all()

?

所有用户先按年龄从小到大,再按id从大到小排序,取前5个

User.query.order_by(User.age,User.id.desc()).limit(5).all()

?

分页查询,每页3个,查询第2页的数据

pn = User.query.paginate(2,3)

pn.items? 获取该页的数据 pn.page?? 获取当前的页码 pn.pages? 获取总页数

?

?

?

3.????? API

document: https://flask-sqlalchemy.palletsprojects.com/en/2.x/api/

?

3.1.??? models

class?flask_sqlalchemy.Model

Base class for SQLAlchemy declarative base model.

?

3.2.??? quesy

class?flask_sqlalchemy.BaseQuery(entities,?session=None)

需要注意的有下面三个方法。

first_or_404(description=None)

Like?first()?but aborts with 404 if not found instead of returning?None.

get_or_404(ident,?description=None)

Like?get()?but aborts with 404 if not found instead of returning?None.

paginate(page=None,?per_page=None,?error_out=True,?max_per_page=None)

Returns?per_page?items from page?page.

@app.route(‘/user/<username>‘)

def show_user(username):

??? user = User.query.filter_by(username=username).first_or_404()

??? return render_template(‘show_user.html‘,user=user)

?

4.????? 问题

4.3.??? 上下文问题

在插入数据时

admin_role = Role(name="Admin")
mod_role = Role(name="Moderator")
user_role = Role(name="User")
a = db.session.add(admin_role)

报错:??? ‘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/.

实际是没有注册db对象,没有获取上下文。

搜索了一番发现在falsk视图函数中,这是会自动进行的,但是在交互式shell中或者在一些脚本中需要手动完成

解决方法:

app.app_context().push()? # 推送应用上下文环境

代码:

def test_crud(self):
??? app = create_app()
??? app.app_context().push()
??? from app.models import User,Role


??? admin_role = Role(name="Admin")
??? #db.session.add(admin_role)

?

或者,使用with语句来处理设置和拆卸:

def my_function():

??? with app.app_context():

??????? user = db.User(...)

??????? db.session.add(user)

??????? db.session.commit()

?

文档:https://flask-sqlalchemy.palletsprojects.com/en/2.x/contexts/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读