Python的sqlalchemy使用原生sql查詢如何返回字典形式的數組?


首先使用一個變量接收你以上的查詢結果。這個查詢結果是一個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]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM