SQLAlchemy與sql語句

先建立sqlalchemy對象 dbpython

增長sql

單一新增:數據庫

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

 批量新增:session

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

查詢優化

all():查詢全部,返回列表spa

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

fitst():查詢第一個,返回對象code

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

get():根據主鍵id獲取對象,主鍵不存在返回Noneorm

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:過濾查詢blog

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))
相關文章
相關標籤/搜索