SQLAlchemy与sql语句

先创建sqlalchemy对象 db

增加

单一新增:

# SQLAlchemy:
db.session.add(user) db.session.commit()
# sql:
inster into 表名 values()

 批量新增:

# SQLAlchemy:
db.session.add_all([user1,user2...]),
db.session.commit()
#sql:
inster into 表名 values()

查询

all():查询所有,返回列表

User.query.all()
sql:
select .. from tb1

fitst():查询第一个,返回对象

User.query.first()
sql:
select .. from tb1 limit 1

get():根据主键id获取对象,主键不存在返回None

User.query.get(2)
sql:
select .. from tb1 where id=2

filter_by:过滤查询

User.query.filter_by(mobile='15910743133').first()
User.query.filter_by(moblie='15910743133',id=1).first()
sql:
select .. from tb1 where mobile='15910743133' limit 1
select .. from tb1 where mobile='15910743133' and id=1 limit 1

filter:过滤查询

User.query.filter(User.mobile=='15910743133').first()
sql:
select .. from tb1 where mobile='15910743133' limit 1

or:

from sqlalchemy import or_
User.query.filter(or_(User.mobile=='15910743133',User.name=='itcast')).all()
sql:
select .. from tb1 where mobile='15910743133' or name='itcast'

and:

from sqlalchemy import and_
User.query.filter(and_(User.name != '13911111111',name='itcast' )).all()
sql:
select ..from tb1 where mobile='15910743133' or name='itcast'

or:

from sqlalchemy import not_
User.query.filter(not_(User.mobile == '15910743133')).all()
sql:
select..from tb1 where mobile!='15910743133'

limit:获取限制数据

User.query.limit(3).all()
sql:
select .. from tb1 limit 3
User.query.offset(2).limit(3).all()
sql:
select .. from tb1 limit 2,3

order_by:排序

User.query.order_by(User.id).all()  # 正序
User.query.order_by(User.id.desc()).all()  # 倒序
sql:
select .. from tb1 order by user_id
select .. from tb1 order by user_id desc

组合查询: 

User.query.filter(User.id > 1).order_by(User.id.desc()).offset(5).limit(3).all()
sql:
select ... from .. where user_id > 1 order by user_id desc limit 5,3

 优化查询:

from sqlalchemy.orm import load_only
User.query.options(load_only(字段1,字段2...)).filter_by(id=1).first()
sql:
select 字段1,字段2,from tb1 where id=1 limit 1

分组聚合查询:

from sqlalchemy import func
db.session.query(Relation.user_id,func.count(Relation.target_user_id)).group_by(Relation.user_id).all()
#列表中的每个元祖都是数据库结果的一条记录,元祖中的每个元素 都是对应的结果字段
sql: select user_id,count(target_user_id) from user_relation group by user_id;

关联查询:

* 通过对象属性获取相关联的表数据,惰性查询

* ForeignKey() + relationship

* relationship + primaryjoin

* 第一种方式:

* 通过db.ForeignKey('数据库表名.数据库字段名') 来表名两个表(模型类)之间的关系

* 通过向模型类补充relationship() 类型的字段属性 来明确,当读取这个属性时 要进行关联查询

* relationship 类型的属性 默认返回列表,列表中是关联的模型类对象

* `uselist ` 如果明确知道表之间是一对一的关系,relationship 属性返回的肯定只有一个模型类对象,所以此时如果不想以列表返回,可以使用uselist=False,直接返回关联的模型类对象

* `lazy` 用于控制如何加载关联对象( 是多次查询 还是一次join查询)

* `select` 默认 在读取关联属性的时候 进行二次查询 查询关联表
* `joined` 在查询主对象的时候 直接使用join语句 完成主表与关联表的数据一起查询
* `dynamic` 动态 每次获取关系属性时 都要查询数据库 (注意 使用dynamic时 不能使用uselist=False)

* `backref` 反引用

```python
class User():

profile = db.relationship('UserProfile', uselist=False, backref='user')
```

backref 是指为UserProfile 模型类补充一个用于进行关联查询的属性 user,当在UserProfile对象中读取user属性的时候 ,会返回关联的User对象

* 第二种方式:
* 不再通过db.ForeignKey来明确表的关系,而是通过relationship 关系属性中 使用primaryjoin 参数来明确表的关系
* 通过向模型类补充relationship() 类型的字段属性 来明确,当读取这个属性时 要进行关联查询

     
#查询手机号为13912345678用户所关注的所有用户
sql:      
select user_basic.user_id, user_relation.target_user_id from user_relation join user_basic on user_relation.user_id=user_basic.user_id where user_basic.mobile='13912345678'
        
from sqlalchemy.orm import load_only, contains_eager
User.query.join(User.follows).options(load_only(User.id),  contains_eager(User.follows).load_only(Relation.target_user_id))

  

  

猜你喜欢

转载自www.cnblogs.com/yzl666/p/11063675.html