一、问题:有时候 ,我们希望通过原生 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'>
源码: