先建立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))