Django 原生 SQL,获取行字段值

1 投票
2 回答
1943 浏览
提问于 2025-04-17 21:17

免责声明:我下面写的原始查询只是示例,我真正的查询要复杂得多,不能直接执行原始查询。

执行这个 SQL:

   from django.db import connection, transaction
   cursor = connection.cursor()
   cursor.execute("SELECT id, name, phone FROM table1 WHERE rule=1")
   result_list= cursor.fetchall()

下一步需要遍历 result_list,并执行第二个查询,在这个查询中,我会在条件中使用 name 参数的值。

for row in result_list:
        sql_string = 'SELECT id FROM table2 WHERE name='+ row[1]
        cursor = connection.cursor()
        cursor.execute(sql_string)
        ids = cursor.fetchall() 

我的问题:我该如何把循环中不同迭代得到的所有 ID 连接成一个单一的 ids 数组/列表?

下面的方式不是我想要的,因为我希望得到一个单一的值数组/列表,而不是一个数组的数组/列表的列表。

id_list = []
id_list.append(ids)

2 个回答

0

我不太确定我是否完全理解这个问题,但也许你应该使用 extend

id_list.extend(ids)
1

对结果列表进行迭代时,每次迭代都会产生一个查询。更好的做法是使用SQL中的IN操作符,一次性在一个查询中选择你第二个表里的所有id

sql_string = 'SELECT id FROM table2 WHERE name IN (%s)'
cursor = connection.cursor()
# You should let cursor.execute handle string interpolation
cursor.execute(sql_string, [', '.join(x.name for x in result_list)]) 
id_list = [x.id for x in cursor.fetchall()]

最后一行使用了列表推导式,把嵌套的列表变成了一个平坦的列表,里面包含了所有的id

撰写回答