學習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')]