PostgreSQL-更新复合类型数组的一个元素

问题描述 投票:0回答:1

我有一个定义如下的PostgreSQL表。

    """ 

    CREATE TYPE similarity AS (

    user_id          integer,
    similarity       real,
    rank             integer
    )
    """,
    """
    CREATE TABLE user_similarities (

    user_id      int REFERENCES books_user_id (user_id) ON UPDATE CASCADE ON DELETE CASCADE,
    similarities similarity[]
    )
    """

这是我用于测试的示例:

enter image description here

我想要实现的是更新数组中我的复合类型(相似性)的一个元素。一个示例是将相似性更改为给定值,比如说user_id = 3的1,相似性。user_id= 10。

通过下面的查询,我可以选择user_id = 3并选择similarities.similarity = 10,但是我不知道如何更新表。

sql = """with list_1 as (SELECT *, unnest(similarities) as list_similarities FROM user_similarities WHERE user_id = 3), id_1 
    as (SELECT * FROM list_1 WHERE(list_1.list_similarities).user_id=10 ) SELECT * FROM id_1"""

我尝试了以下操作:

with list_1 as (SELECT *, unnest(similarities) as list_similarities FROM user_similarities WHERE user_id = 3), 
id_1 as (SELECT * FROM list_1 WHERE(list_1.list_similarities).user_id=10 ) UPDATE id_1 SET 
list_similarities.similarity = 1 

但是我收到错误消息:关系“ id_1”不存在第2行:... ERE(list_1.list_likeities).user_id = 10)更新id_1 SET l ...

这里是整个功能:

def update_similarity(connection,id_ ):

sql = """with list_1 as (SELECT *, unnest(similarities) as list_similarities FROM user_similarities WHERE user_id = 3), id_1 
as (SELECT * FROM list_1 WHERE(list_1.list_similarities).user_id=10 ) UPDATE id_1 SET list_similarities.similarity = 1 """

to_insert = (id_,)
bol = 0
try:
    conn = connection
    # create a new cursor
    cur = conn.cursor()
    # execute the INSERT statement
    cur.execute(sql, to_insert)
    request = cur.fetchall()
    if len(request) > 0:
        bol = 1
    cur.close()
except (Exception, psycopg2.DatabaseError) as error:
    print(error)

return bol

任何帮助将不胜感激。

我有一个PostgreSQL表,其定义如下。 “”“ CREATE TYPE相似度AS(user_id整数,相似度实数,等级整数)”“”,...

python sql postgresql
1个回答
0
投票

如果我理解正确,您已经知道要为其更新user_id值的similarity.user_idsimilarity.similarity。我假设您也知道要使用其更新的值,并且它并不意味着要作为此查询的一部分进行计算。

© www.soinside.com 2019 - 2024. All rights reserved.