我有一个 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]:...
^