首先使用一個變量接收你以上的查詢結果。這個查詢結果是一個list,在這個list中包含着一個或多個tuple,其實這並不是標准的Python tuple,而是一個特殊的類型"<class 'sqlalchemy.util._collections.result'>",這是一個 AbstractKeyedTuple 對象,它擁有一個 keys() 方法。我們可以通過這個方法將查詢結果轉換為字典,需要傳到前端展示只需要將其裝換為json格式即可。
示例:data = [dict(zip(result.keys(), result)) for result in results]
1.獲取session
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 __author__ = "JentZhang" 4 from utils.config import AppConfig 5 from sqlalchemy.ext.declarative import declarative_base 6 from sqlalchemy.orm import sessionmaker, relationship 7 from sqlalchemy import create_engine, text, event 8 9 # 創建對象的基類: 10 Base = declarative_base() 11 12 13 def get_yun_session(): 14 """ 15 初始化yun數據庫連接 16 :return: 17 """ 18 # '數據庫類型+數據庫驅動名稱://用戶名:口令@機器地址:端口號/數據庫名' 19 engine = create_engine( 20 "mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8" % ( 21 AppConfig.USER, AppConfig.PASSWORD, AppConfig.HOST, AppConfig.PORT, AppConfig.DATABASE_YUN), 22 max_overflow=AppConfig.MAX_OVERFLOW, 23 pool_size=500, # 連接池大小 24 pool_timeout=30, # 池中沒有線程最多等待的時間,否則報錯 25 pool_recycle=100 # 多久之后對線程池中的線程進行一次連接的回收(重置) 26 ) 27 session_maker = sessionmaker(bind=engine) 28 return session_maker()
2.使用原生sql查詢
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 __author__ = "JentZhang" 4 5 from utils.mysql_utils import get_yun_dw_session, get_yun_session 6 from model import fac_broker, fac_message 7 from sqlalchemy import text 8 9 10 def get_user_list_dal(*args, **kwargs): 11 """ 12 獲取用戶列表 13 :param args: 14 :param kwargs: 15 :return: 16 """ 17 session = get_yun_session() 18 sql_str = """ 19 SELECT 20 a.user_id, 21 a.city_id, 22 a.`name`, 23 a.mobile, 24 DATE_FORMAT(a.create_time, '%Y-%m-%d') AS create_date, 25 IFNULL( 26 DATE_FORMAT( 27 a.login_first_time, 28 '%Y-%m-%d' 29 ), 30 '' 31 ) AS login_first_date, 32 IFNULL( 33 DATE_FORMAT(c.last_login, '%Y-%m-%d'), 34 '' 35 ) AS last_login_date, 36 ( 37 CASE 38 WHEN isnull(d.user_id) THEN 39 '自然下載' 40 ELSE 41 d.channel_name 42 END 43 ) AS channel_name 44 FROM 45 card_broker a 46 LEFT JOIN fang_webgetcity b ON a.city_id = b.city_id 47 LEFT JOIN account_user c ON a.user_id = c.id 48 LEFT JOIN View_Broker_Channel d ON a.user_id = d.new_user_id 49 where a.create_time>'2020-04-01' 50 """ 51 res_rows = session.execute(text(sql_str)).fetchall() 54 session.close() 55 result = [dict(zip(result.keys(), result)) for result in res_rows] 56 print(result) 57 58 59 if __name__ == '__main__': 60 get_user_list_dal()
幾點提醒:
1.代碼中設計到的數據庫連接的配置文件:
1 class AppConfig(object): 2 # 數據庫相關(測試) 3 HOST = '127.0.0.1' 4 PORT = 3306 5 USER = 'root' 6 PASSWORD = 'admin' 7 DATABASE_YUN = 'yun' 8 ECHO = False 9 10 MAX_OVERFLOW = 500
2.對於使用原生SQL查詢出來的結果是一個list,
首先,使用一個變量接收你以上的查詢結果。
其次,在這個list中包含着一個或多個tuple,其實這並不是標准的Python tuple,而是一個特殊的類型"<class 'sqlalchemy.util._collections.result'>",
這是一個 AbstractKeyedTuple 對象,它擁有一個 keys() 方法。
最后,我們可以通過這個方法將查詢結果轉換為字典,需要傳到前端展示只需要將其裝換為json格式即可。
示例:data = [dict(zip(result.keys(), result)) for result in results]