sqlalchemy_查詢操作

學習sqlalchemy其實就是學習 python中的一個ORM組件

下面可以先看看資料,如果不太理解可以看看本文,循序漸進的瞭解知識點。

根據前面一篇文章,繼續瞭解sqlalchemy基礎,查詢相關操作。此文與創建表、添加數據文章相關聯,同上述文章所述,先創建一個會話Session

engine=create_engine("mysql+pymysql://test:[email protected]/pythonstudy",
                       encoding='utf-8', echo=True)
Base=declarative_base()  #生成orm基類
Session=sessionmaker(bind=engine)   #這裏的Session只是一個類, 而不是實例
session=Session()  #創建Session類實例

Query對象使用所創建的 query()上方法 Session。此函數採用可變數量的參數,這些參數可以是類和類檢測描述符的任意組合。下面,我們指出 Query哪個加載User實例。在迭代上下文中計算時,將User返回存在的對象列表

查詢實例分析

1. session.query(User).all(),映射所有數據集合

our_users = session.query(User).all()
for user in our_users:print('name:'+user.get_name()+'    pwd:'+user.get_pwd())

結果如下:

2019-09-17 19:53:21,414 INFO sqlalchemy.engine.base.Engine SELECT user.id AS user_id, user.name AS user_name, user.password AS user_password 
FROM user
2019-09-17 19:53:21,415 INFO sqlalchemy.engine.base.Engine {}
name:test    pwd:hahha
name:wangfangchen    pwd:123456
name:wendy    pwd:foobar
name:mary    pwd:xxg527
name:fred    pwd:blah
name:fred    pwd:safdsaewsa

2. session.query(User).order_by(User.id) 根據字段並排序

print('*'*30+'查詢所有集合並打印,根據某個字段排序查找'+'*'*30)
for instance in session.query(User).order_by(User.id):
    print(instance.id,instance.name, instance.password)

結果如下:

******************************查詢所有集合並打印,根據某個字段排序查找******************************
2019-09-17 19:53:21,432 INFO sqlalchemy.engine.base.Engine SELECT user.id AS user_id, user.name AS user_name, user.password AS user_password 
FROM user ORDER BY user.id
2019-09-17 19:53:21,432 INFO sqlalchemy.engine.base.Engine {}
1 test hahha
7 wangfangchen 123456
8 wendy foobar
9 mary xxg527
10 fred blah
11 fred safdsaewsa

3.查詢指定字段,session.query(User.name, User.password):

print('*'*30+'查詢指定字段並打印'+'*'*30)
for  name,password in session.query(User.name, User.password):
      print(name, password)

結果如下:

******************************查詢指定字段並打印******************************
2019-09-17 19:53:21,449 INFO sqlalchemy.engine.base.Engine SELECT user.name AS user_name, user.password AS user_password 
FROM user
2019-09-17 19:53:21,449 INFO sqlalchemy.engine.base.Engine {}
test hahha
wangfangchen 123456
wendy foobar
mary xxg527
fred blah
fred safdsaewsa

4.filter_by() 過濾查詢,通過關鍵字

print('*'*30+'filter_by() 使用關鍵字參數:'+'*'*30)
for pwd, in session.query(User.password). filter_by(name='mary'):
    print(pwd)

結果:

******************************filter_by() 使用關鍵字參數:******************************
2019-09-17 19:53:21,465 INFO sqlalchemy.engine.base.Engine SELECT user.password AS user_password 
FROM user 
WHERE user.name = %(name_1)s
2019-09-17 19:53:21,465 INFO sqlalchemy.engine.base.Engine {'name_1': 'mary'}
xxg527

5.filter_by接收的參數形式是關鍵字參數,而filter接收的參數是更加靈活的SQL表達式結構

for user in session.query(User).filter(User.name =='test').all():
    print(user)

結果:

************************************************************
2019-09-17 19:53:21,495 INFO sqlalchemy.engine.base.Engine SELECT user.id AS user_id, user.name AS user_name, user.password AS user_password 
FROM user 
WHERE user.name = %(name_1)s
2019-09-17 19:53:21,495 INFO sqlalchemy.engine.base.Engine {'name_1': 'test'}
<com.wfc.python.day10sqlalchemy.User.User object at 0x000001FE7E70D908>

6.還有幾個常用的過濾和查詢關鍵詞: equals、 not equal、like、in、notin、text、多filter|filter組合、count

print('*'*30+'常用的過濾操作equals'+'*'*30)
for user in session.query(User).filter(User.name =='test').all():
    print(user)
print('*'*30+'常用的過濾操作not equal:'+'*'*30)
for user in session.query(User).filter(User.name !='test').all():
    print(user)

print('*'*30+'常用的過濾操作like:'+'*'*30)
for user in session.query(User).filter(User.name.like('%ma%')).all():
    print(user.get_name(),user.get_pwd())

print('*'*30+'常用的過濾操作  in 通配符:'+'*'*30)
for user in session.query(User).filter(User.name.in_(['wangfangchen','test'])).all():
    print(user.get_name(),user.get_pwd())

print('*'*30+'常用的過濾操作  多次調用filter  filter_by:'+'*'*30)
for user in session.query(User).filter(User.name =='test').filter(User.password=='hahha').all():
    print(user.get_name(),user.get_pwd())

print('''

query.all(): all()返回列表
query.first(): 返回第一個元素
query.one(): 有且只有一個元素時才正確返回。
''')


print('*'*30+'filter函數還可以接收text對象,text是SQL查詢語句的字面對象'+'*'*30)
for user in session.query(User).filter(text('id<8')).order_by(text('id')).all():
    print(user.get_name(),user.get_pwd())


print('*'*30+'count'+'*'*30)
print('''
有兩種count,第一種是純粹是執行SQL語句後返回有多少行,對應的函數count(),
第二個是func.count(),適用在分組統計,比如按性別分組時,男的有多少,女的多少:
''')
number0=session.query(User).filter(User.name=='fred').count()
number1=session.query(func.count(), User.name).group_by(User.name).all()
print(number0)
print(number1)

結果如下:

************************************************************
2019-09-17 19:53:21,495 INFO sqlalchemy.engine.base.Engine SELECT user.id AS user_id, user.name AS user_name, user.password AS user_password 
FROM user 
WHERE user.name = %(name_1)s
2019-09-17 19:53:21,495 INFO sqlalchemy.engine.base.Engine {'name_1': 'test'}
<com.wfc.python.day10sqlalchemy.User.User object at 0x000001FE7E70D908>
******************************常用的過濾操作equals******************************
2019-09-17 19:53:21,511 INFO sqlalchemy.engine.base.Engine SELECT user.id AS user_id, user.name AS user_name, user.password AS user_password 
FROM user 
WHERE user.name = %(name_1)s
2019-09-17 19:53:21,511 INFO sqlalchemy.engine.base.Engine {'name_1': 'test'}
<com.wfc.python.day10sqlalchemy.User.User object at 0x000001FE7E70D908>
******************************常用的過濾操作not equal:******************************
2019-09-17 19:53:21,526 INFO sqlalchemy.engine.base.Engine SELECT user.id AS user_id, user.name AS user_name, user.password AS user_password 
FROM user 
WHERE user.name != %(name_1)s
2019-09-17 19:53:21,526 INFO sqlalchemy.engine.base.Engine {'name_1': 'test'}
<com.wfc.python.day10sqlalchemy.User.User object at 0x000001FE7E70D5C0>
<com.wfc.python.day10sqlalchemy.User.User object at 0x000001FE7E76F208>
<com.wfc.python.day10sqlalchemy.User.User object at 0x000001FE7E70D630>
<com.wfc.python.day10sqlalchemy.User.User object at 0x000001FE7E751AC8>
<com.wfc.python.day10sqlalchemy.User.User object at 0x000001FE7E751C88>
******************************常用的過濾操作like:******************************
2019-09-17 19:53:21,542 INFO sqlalchemy.engine.base.Engine SELECT user.id AS user_id, user.name AS user_name, user.password AS user_password 
FROM user 
WHERE user.name LIKE %(name_1)s
2019-09-17 19:53:21,542 INFO sqlalchemy.engine.base.Engine {'name_1': '%ma%'}
mary xxg527
******************************常用的過濾操作  in 通配符:******************************
2019-09-17 19:53:21,557 INFO sqlalchemy.engine.base.Engine SELECT user.id AS user_id, user.name AS user_name, user.password AS user_password 
FROM user 
WHERE user.name IN (%(name_1)s, %(name_2)s)
2019-09-17 19:53:21,557 INFO sqlalchemy.engine.base.Engine {'name_1': 'wangfangchen', 'name_2': 'test'}
test hahha
wangfangchen 123456
******************************常用的過濾操作  多次調用filter  filter_by:******************************
2019-09-17 19:53:21,572 INFO sqlalchemy.engine.base.Engine SELECT user.id AS user_id, user.name AS user_name, user.password AS user_password 
FROM user 
WHERE user.name = %(name_1)s AND user.password = %(password_1)s
2019-09-17 19:53:21,573 INFO sqlalchemy.engine.base.Engine {'name_1': 'test', 'password_1': 'hahha'}
test hahha


query.all(): all()返回列表
query.first(): 返回第一個元素
query.one(): 有且只有一個元素時才正確返回。

******************************filter函數還可以接收text對象,text是SQL查詢語句的字面對象******************************
2019-09-17 19:53:21,588 INFO sqlalchemy.engine.base.Engine SELECT user.id AS user_id, user.name AS user_name, user.password AS user_password 
FROM user 
WHERE id<8 ORDER BY id
2019-09-17 19:53:21,588 INFO sqlalchemy.engine.base.Engine {}
test hahha
wangfangchen 123456
******************************count******************************

有兩種count,第一種是純粹是執行SQL語句後返回有多少行,對應的函數count(),
第二個是func.count(),適用在分組統計,比如按性別分組時,男的有多少,女的多少:

2019-09-17 19:53:21,604 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1 
FROM (SELECT user.id AS user_id, user.name AS user_name, user.password AS user_password 
FROM user 
WHERE user.name = %(name_1)s) AS anon_1
2019-09-17 19:53:21,604 INFO sqlalchemy.engine.base.Engine {'name_1': 'fred'}
2019-09-17 19:53:21,619 INFO sqlalchemy.engine.base.Engine SELECT count(*) AS count_1, user.name AS user_name 
FROM user GROUP BY user.name
2019-09-17 19:53:21,619 INFO sqlalchemy.engine.base.Engine {}
2
[(2, 'fred'), (1, 'mary'), (1, 'test'), (1, 'wangfangchen'), (1, 'wendy')]

此文源碼地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章