sqlalchemy学习(二)-使用原生sql 查询数据库

一、问题:有时候 ,我们希望通过原生 sql 来查询数据库,这个时候 应该怎么办呢?
sqlalchemy 已经给我们提供了这样的接口, 通过 text 就可以轻松实现了。
二、代码实现:
1.无参数查询:

        # 无参数查询
        sql = 'SELECT machine_room_name,type FROM machine_room limit 2'
        result = session.execute(text(sql))
        print(type(result))

打印:

PS D:\demo_sqlalchemy> python -u "d:\demo_sqlalchemy\sqlalchemy\main.py"
<class 'sqlalchemy.engine.result.ResultProxy'>
('daidai', 0)
('鏍稿績鍩熸満鎴?, 1)

可以看到结果并不是我们想要的类型,如果想得到一个列表,我们可以使用fetchall()

        # 无参数查询
        sql = 'SELECT machine_room_name,type FROM machine_room limit 2'
        result = session.execute(text(sql)).fetchall()
        print(type(result))

打印:

PS D:\demo_sqlalchemy> python -u "d:\demo_sqlalchemy\sqlalchemy\main.py"
<class 'list'>
('daidai', 0)
('鏍稿績鍩熸満鎴?, 1)

fetchone():查询时获取结果集的第一行数据,返回一个元组,该元组元素即为第一行数据,如果没有则为null(注:在python中使用应为None)。
fetchall(): 查询时获取结果集中的所有行,一行构成一个元组,然后再将这些元组返回(即嵌套元组)。

2.传参查询:

        # 2.有参数查询
        sql = 'SELECT SUM(software_count) FROM domain_number WHERE user_domain_moid IN (SELECT user_domain_moid FROM user_domain_machine WHERE machine_room_moid =:machine_room_moid)'
        result = session.execute(text(sql), {
    
    "machine_room_moid": 'mooooooo-oooo-oooo-oooo-defaultmachi'}).fetchone()

传入参数 :machine_room_moid,sql 要通过 text 包装一下, 这样就可以 通过 session 对象 的 execute 方法,向数据库里面查询,写入数据了。注意参数是一个字典, key 就是 sql 中定义的参数。
对于结果我们可以进行转换得到我们想要的值:

        # 2.有参数查询
        sql = 'SELECT SUM(software_count) FROM domain_number WHERE user_domain_moid IN (SELECT user_domain_moid FROM user_domain_machine WHERE machine_room_moid =:machine_room_moid)'
        result = session.execute(text(sql), {
    
    "machine_room_moid": 'mooooooo-oooo-oooo-oooo-defaultmachi'}).fetchone()
        print(type(result))
        for i in result:
            print(type(i))
            print(i)
            print(int(i))
            print(type(int(i)))

打印:

PS D:\demo_sqlalchemy> python -u "d:\demo_sqlalchemy\sqlalchemy\main.py"
<class 'sqlalchemy.engine.result.RowProxy'>
<class 'decimal.Decimal'>
19
19
<class 'int'>

源码:

猜你喜欢

转载自blog.csdn.net/qq_34663267/article/details/109120033
今日推荐