如何在Python的SQL语句中使用变量和/或连接?

2024-04-26 17:41:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我在名为res的列表中有一个ID列表,在将结果保存到数组中之前,我希望逐行使用该列表作为SQL查询的WHERE条件:

                              ids
grupos                           
0       [160, 161, 365, 386, 471]
1                      [296, 306]

下面是我试图在SQL查询中插入的内容:

listado = [None]*len(res)
# We store the hashtags that describes the best the groups
# We iterate on the people of a group to construct the WHERE condition
print "res : ", res
for i in (0,len(res)):        

conn = psycopg2.connect(**params)
cur = conn.cursor()

listado = [None]*len(res)
for i in (0,len(res)):        
    print "res[i:p] : ", res.iloc[i]['ids']
    cur.execute("""SELECT COUNT(swipe.eclipse_id), subscriber_hashtag.hashtag_id  FROM subscriber_hashtag
    -- join para que las publicidades/eclipses que gusta un usarios estan vinculadas con las de la tabla de correspondencia con los hashtag
    INNER JOIN eclipse_hashtag ON eclipse_hashtag.hashtag_id = subscriber_hashtag.hashtag_id
    -- join para que los usarios  estan vinculados con los de la tabla de correspondencia con los hashtag
    LEFT OUTER JOIN swipe ON subscriber_hashtag.subscriber_id = swipe.subscriber_id
    -- recobremos los "me gusta"
    WHERE subscriber_hastag.subscriber_id in (%s)
    GROUP BY subscriber_hashtag.hashtag_id
        ORDER BY COUNT(swipe.eclipse_id) DESC;""",(res.iloc[i]['ids']))

    n = cur.fetchall()
    listado[i] = [{"count": elem[0], "eclipse_id": elem[1]} for elem in n]

可再现示例的数据

提供进一步的数据信息:

subscriber_id hashtag_id
160           345
160           347
161           345
160           334
161           347
306           325
296           362
306           324
296           326
161           322
160           322

这里的输出应该是:

{0:[324,1],[325,1],[326,1],[362,1], 1 : [345,2],[347,2],[334,1]}

当前错误消息

错误:标记输入时发生意外错误 以下回溯可能已损坏或无效 错误消息是:('EOF in multi-line string',(1,50))

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-44-f7c3c5b81303> in <module>()
     39         WHERE subscriber_hastag.subscriber_id in (%s)
     40         GROUP BY subscriber_hashtag.hashtag_id
---> 41             ORDER BY COUNT(swipe.eclipse_id) DESC;""",(res.iloc[i]['ids']))
     42 
     43         n = cur.fetchall()

TypeError:不是所有参数都在字符串格式化期间转换


Tags: theinididslendereswhere
1条回答
网友
1楼 · 发布于 2024-04-26 17:41:57

看看tuples adaptation

Python tuples are converted into a syntax suitable for the SQL IN operator and to represent a composite type:

将id作为元组查询参数传递,因此要执行的参数是一个1元组的id元组,并将手动括号放在%s周围。目前,您的(res.iloc[i]['ids'])只是一个冗余括号中的序列表达式,因此execute()使用它作为参数序列,这会导致TypeError异常;您的参数序列的参数比查询的占位符多。你知道吗

试试(tuple(res.iloc[i]['ids']),)。注意逗号,它是一个very common error to omit it。总而言之:

cur.execute("""SELECT COUNT(swipe.eclipse_id), 
subscriber_hashtag.hashtag_id
FROM subscriber_hashtag
INNER JOIN eclipse_hashtag ON eclipse_hashtag.hashtag_id = subscriber_hashtag.hashtag_id
LEFT OUTER JOIN swipe ON subscriber_hashtag.subscriber_id = swipe.subscriber_id
WHERE subscriber_hashtag.subscriber_id in %s
GROUP BY subscriber_hashtag.hashtag_id
    ORDER BY COUNT(swipe.eclipse_id) DESC;""",
(tuple(res.iloc[i]['ids']),))

for循环有点奇怪,因为您迭代了一个2元组(0, len(res))。也许你的意思是range(len(res))。您也可以迭代熊猫系列:

for i, ids in enumerate(res['ids']):
    ...
    cur.execute(..., (tuple(ids),))

相关问题 更多 >