0

我有一个 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[]
        )
        """

要插入值,我使用完全受http://www.postgresqltutorial.com/postgresql-python/insert/启发的以下函数

def insert_similarities(connection, user_id,sim_user,sim,rank):
    """ insert a similarities into user_similarities"""
    sql = """INSERT INTO user_similarities(user_id,similarities)
             VALUES(%s,%s::similarity[]);"""
    #conn = None
    #vendor_id = None
    test = [(sim_user,sim_,rank)]

    try:
        # read database configuration
        # connect to the PostgreSQL database
        conn = connection
        # create a new cursor
        cur = conn.cursor()
        # execute the INSERT statement
        cur.execute(sql, (user_id,test))
        # commit the changes to the database
        conn.commit()
        # close communication with the database
        cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)

我想要实现的是将新的相似性类型值附加到给定用户的相似性数组中。在https://www.postgresql.org/docs/9.1/functions-array.html已经有现有的功能可以完成这项工作,但我没有正确使用它们,我不知道该怎么做......我想使用的功能是:在此处输入图像描述

我尝试了很多sql查询,这里有一个例子,显然不成功

sql = """UPDATE user_similarities SET similarities = array_append(similarities, %s::similarity[]) WHERE user_id = %s;"""

要测试输出,我执行以下操作:

conn = psycopg2.connect("dbname=recommendation_t user=Etienne")
cur = conn.cursor()
cur.execute(sql,([40,0.2,2],2))

我得到:

CannotCoerce: cannot cast type integer to similarity
LINE 1: ...T similarities = array_append(similarities, ARRAY[40,0.2,2]:...
                                                           ^
4

1 回答 1

1

的第二个参数array_append是一个数组元素,而不是数组。你必须更换

array_append(similarities, %s::similarity[])

array_append(similarities, %s::similarity) 
于 2019-11-13T16:38:34.930 回答