Flask的ORM和查询操作

Flask 的ORM

SQLAlchemy

SQLAlchemy是Python编程语言下的一个嵌入式软件。提供了SQL工具包以及对象关系映射(ORM)工具。

SQLAlchemy“采用简单的Python语言,为高效和高级的数据库访问设计,实现完整的企业级持久模型”。

SQLAlchemy首次发行于2006年2月,并迅速地在Python社区中最广泛使用的ORM工具之一,不亚于Django的ORM框架。

Flask-SQLAlchemy

Flask-SQLAlchemy是在Flask框架的一个扩展中,其对SQLAlchemy进行了封装,目的在于简化在Flask中。SQLAlchemy的使用,提供了有用的替代价值和额外的助手来简化简单地完成日常任务

映射关系

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)

class Config(object):
    SQLALCHEMY_DATABASE_URI = ‘mysql://root:[email protected]:3306/toutiao‘
    ‘‘‘
    Postgres:
    postgresql://user:[email protected]/mydatabase

    MySQL:
    mysql://user:[email protected]/mydatabase

    Oracle:
    oracle://user:[email protected]:1521/sidname

    SQLite (注意开头的四个斜线):
    sqlite:////absolute/path/to/foo.db
    ‘‘‘
    SQLALCHEMY_TRACK_MODIFICATIONS = False #在Flask中是否追踪数据修改
    SQLALCHEMY_ECHO = False #显示生成的sql语句

app.config.from_object(Config)#向工程中导入配置

db = SQLAlchemy(app) #创建连接对象

class User(db.Model):
    """
    用户基本信息
    """
    __tablename__ = ‘user_basic‘#在数据库中的表名

    class STATUS:#创建一个储存常量的类 方便下面使用
        ENABLE = 1
        DISABLE = 0

    id = db.Column(‘user_id‘, db.Integer, primary_key=True, doc=‘用户ID‘)#如果在库中的字段名想和模型类中的不一样 可以在这里重新设置
    mobile = db.Column(db.String, doc=‘手机号‘)#这里不重新设置 就默认相同
    password = db.Column(db.String, doc=‘密码‘)
    name = db.Column(‘user_name‘, db.String, doc=‘昵称‘)
    profile_photo = db.Column(db.String, doc=‘头像‘)
    last_login = db.Column(db.DateTime, doc=‘最后登录时间‘)
    is_media = db.Column(db.Boolean, default=False, doc=‘是否是自媒体‘)
    is_verified = db.Column(db.Boolean, default=False, doc=‘是否实名认证‘)
    introduction = db.Column(db.String, doc=‘简介‘)
    certificate = db.Column(db.String, doc=‘认证‘)
    article_count = db.Column(db.Integer, default=0, doc=‘发帖数‘)
    following_count = db.Column(db.Integer, default=0, doc=‘关注的人数‘)
    fans_count = db.Column(db.Integer, default=0, doc=‘被关注的人数(粉丝数)‘)
    like_count = db.Column(db.Integer, default=0, doc=‘累计点赞人数‘)
    read_count = db.Column(db.Integer, default=0, doc=‘累计阅读人数‘)
    account = db.Column(db.String, doc=‘账号‘)
    email = db.Column(db.String, doc=‘邮箱‘)
    status = db.Column(db.Integer, default=1, doc=‘状态,是否可用‘)

操作

新增

from db_demo import app,db,User
user = User(mobile=‘13112345678‘,name= ‘小红‘)
db.session.add(user)#这个session是临时保存上传数据用的
db.session.commit()

也可以批量添加

db.session.add_all([user1,user2,user3])
db.session.commit()

删除

第一种

  user = User.query.order_by(User.id.desc()).first()
  db.session.delete(user)
  db.session.commit()

第二种

  User.query.filter(User.mobile=‘18512345678‘).delete()
  db.session.commit()

修改

第一种

  user = User.query.get(1)
  user.name = ‘Python‘
  db.session.add(user)
  db.session.commit()

第二种

  User.query.filter_by(id=1).update({‘name‘:‘python‘})
  db.session.commit()

查询

User.query.all()#查询所有 返回列表
User.query.first() #查询第一个   返回对象
User.query.get(2) #根据主键id获取对象 如果没有则返回None

原生SQLAlchemy查询语句
db.session.query(User).all()
db.session.query(User).first()
db.session.query(User).get(2)

过滤查询

filter_by#只能查查询条件是 =  和and的 其他功能要用filter

User.query.filter_by(id=1)
#<flask_sqlalchemy.BaseQuery object at 0x7f6d9edbb630>
User.query.filter_by(id=1).first()
#<User 1>
User.query.filter_by(id=1).all()
#[<User 1>]
User.query.filter_by(mobile=‘13911111111‘, id=1).first()  # and关系
两者区别 filter 里面的参数还要加模型类.属性      filter 里的等于是==
filter

User.query.filter(User.mobile==‘13911111111‘).first()
User.query.filter(User.id>10).all()
#[<User 11>, <User 12>, <User 13>, <User 14>, <User 15>, <User 16>...]

from sqlalchemy import or_,not_,and_
User.query.filter(or_(User.id>10,User.mobile==‘13173686247‘)).all()

模糊查询

User.query.filter(User.mobile.startswith(‘131‘)).all()

相当于sql语句里的

select * from User where mobile like ‘131%‘;

offset

偏移,起始位置

User.query.offset(2).all()

limit

获取限制数据

User.query.limit(3).all()

合起来使用

User.query.offset(6).limit(3).all()
#[<User 7>, <User 8>, <User 9>]

相当于sql语句里的

select * from User limit 6,3;

order_by

排序

User.query.order_by(User.id).all()  # 正序
User.query.order_by(User.id.desc()).all()  # 倒序

相当于sql语句中的

select * from User order by id asc;
select * from User order by id desc;

优化查询

有的时候我们并不需要查出所有字段 查出的无用数据反而会造成资源浪费

from sqlalchemy.orm import load_only

User.query.options(load_only(User.name,User.mobile)).filter_by(id=1).first()#查询特定字段  options 选项

聚合查询

from sqlalchemy import func

db.session.query(表.关注者,func.count(表.被关注者)).group_by(表.关注者)

返回一个列表 [(1,3),(2,4),(4,5)]  ————>一号用户关注了三个 二号用户关注了四个 四号用户关注了五个

#例子 查询用户关注表 中 每个用户关注了几个用户
select 关注者 count(被关注者) from 表 group by 关注者;

关联查询

1. 使用ForeignKey
class User(db.Model):
    ...
    profile = db.relationship(‘UserProfile‘, uselist=False)
    followings = db.relationship(‘Relation‘)

class UserProfile(db.Model):
    id = db.Column(‘user_id‘, db.Integer, db.ForeignKey(‘user_basic.user_id‘), primary_key=True,  doc=‘用户ID‘)
    ...

class Relation(db.Model):
    user_id = db.Column(db.Integer, db.ForeignKey(‘user_basic.user_id‘), doc=‘用户ID‘)
    ...

# 测试
user = User.query.get(1)
user.profile.gender
user.followings
2. 使用primaryjoin
class User(db.Model):
    ...

    profile = db.relationship(‘UserProfile‘, primaryjoin=‘User.id==foreign(UserProfile.id)‘, uselist=False)
    followings = db.relationship(‘Relation‘, primaryjoin=‘User.id==foreign(Relation.user_id)‘)

# 测试
user = User.query.get(1)
user.profile.gender
user.followings
3. 指定字段关联查询
class Relation(db.Model):
    ...
    target_user = db.relationship(‘User‘, primaryjoin=‘Relation.target_user_id==foreign(User.id)‘, uselist=False)

from sqlalchemy.orm import load_only, contains_eager

Relation.query.join(Relation.target_user).options(load_only(Relation.target_user_id), contains_eager(Relation.target_user).load_only(User.name)).all()

事务

???

原文地址:https://www.cnblogs.com/xujin247/p/11779777.html

时间: 2024-11-24 05:29:16

Flask的ORM和查询操作的相关文章

OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当然,可以用代码生成器,不过配套的代码生成器暂时没有):又从网上找了一个封装了泛型方法的OracleHelper类,整合到一起,但貌似数据增删改查依然不方便:于是花了两天时间,在原有基础上对增删改查分页查询操作进行了面向对象的封装,并且对批量增删改操作进行事务封装,写事务代码更方便. 原理: 1.利用

Laravel Eloquent ORM 数据model操作

Laravel ORM 数据model操作 注意:ORM关联操作最后一定要记得带get()方法!否则会获取不到数据,为null 如: posts表 comments表  id id  contents post_id comment post模型内定义一对多关系hasMany 1 //定义关联关系 2 public function comments(){ 3 return $this->hasMany(Comments::class,'post_id','id'); 4 } 1 //容器内调用

Laravel ORM 数据model操作

1.ORM操作需要创建对应的model class User extends Eloquent 2.有两种方式使用数据操作对象 a. 使用new关键字创建对象后执行对象的方法 b. 直接调用static方法(实际并发静态方法,而是fascade生成的) 3.常用数据操作 a.  User::find(1)    查找单条数据       b.  User::all()        查找所有数据       c.   User::find(1)->delete()    删除单条数据     

ORM的相关操作

ORM的概念 ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中.ORM在业务逻辑层和数据库层之间充当了桥梁的作用.ORM的优势:ORM解决的主要问题是对象和关系的映射ORM提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据.ORM的劣势:在一定程度上牺牲程序的执行效率. 在Django中格式使用ORM连接Mysql ''' 1. 手动创建数据库 2. 在settings.py里面配置一下数据库的连接信息(告诉Django连接哪

django orm 的查询条件

Django的ORM查询操作: 查询数据库操作是一个非常重要的技术.在Django中,查询一般就是使用filter.exclude.get三个方法来实现,在调用这些方法的时候传递不同的参数来实现查询需求. 在mysql中,想要查询数据,就需要使用where关键字加上字段条件去查询,在Django的orm之中,我们使用filter.exclude.get关键词加上field+__+condition作为关键词去查询,现在我们就来介绍一下这里的condition: 注:查询原生SQL语句: 1.在q

17-2 orm单表操作和多表操作

参考:https://www.cnblogs.com/liwenzhou/p/8660826.html 一  ORM单表操作 1 增删改查 1 1. 查询 2 1. 查所有 3 models.Publisher.objects.all() 4 2. 查某个具体的记录 5 models.Publisher.objects.get(id=1) --> 注意查询条件不成立就报错 6 2. 删除一条记录 7 models.Publisher.objects.get(id=1).delete() 8 3.

ORM表相关操作

一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误. <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> values(*field): 返回

part8:查询操作

查询操作是Django的ORM框架中最重要的内容之一.我们建立模型.保存数据为的就是在需要的时候可以查询得到数据.Django自动为所有的模型提供了一套完善.方便.高效的API,一些重要的,我们要背下来,一些不常用的,要有印象,使用的时候可以快速查找参考手册. 本节的内容基于如下的一个博客应用模型: from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagl

9.17 模型层 ORM 单表操作

1 创建模型 创建名为book的app,在book下的models.py中创建模型: from django.db import models # Create your models here. class Book(models.Model): id=models.AutoField(primary_key=True) title=models.CharField(max_length=32) state=models.BooleanField() pub_date=models.DateF