我处理一个文章列表,每个文章都包含可变数量的标签。如果我不知道有多少标签可以用于以后的更新,如何将标签列表存储在列中?我第一次可以通过None
填写相同长度的标签列表,但是如果使用新的更新我会获得更长的标签列表呢?
今天的标签列表:
[tag1, tag2]
[tag1, tag2, tag3]
好的,明白了!最大长度为3,长度相等:
[tag1, tag2, None]
[tag1, tag2, tag3]
明天的标签列表:
[tag1, tag2]
[tag1, tag2, tag3]
[tag1, tag2, tag3, tag4]
好的,明白了!我的最大长度是3:
[tag1, tag2, None]
[tag1, tag2, tag3]
[tag1, tag2, tag3, tag4] <- here is problem
也许有人知道这种情况的更好解决方案?
更新
for tags in tags_list:
cursor.execute("""INSERT INTO tags VALUES (%s)""", (tags,))
答案 0 :(得分:2)
您似乎认为数组在Postgres中具有固定长度 - 但它们不会:
create table antosha (article_id integer primary key, tags text[]);
insert into antosha (article_id, tags)
values
(1, array['sql', 'dbms']),
(2, array['java', 'jdbc']);
如果你想添加标签,只需附加它们:
-- append a single tag
update antosha
set tags = tags || 'postgresql'
where id = 1;
-- append multiple tags
update antosha
set tags = tags || array['kotlin', 'python']
where id = 2;
或完全替换标签:
update antosha
set tags = array['one', 'two', 'three', 'four', 'five', 'six']
where id = 1;
或删除单个元素:
update antosha
set tags = array_remove(tags, 'two')
where id = 1;
或替换单个元素:
update antosha
set tags = array_replace(tags, 'one', '001')
where id = 1;
答案 1 :(得分:1)
按原样存储:
t=# create table a (c text[]);
CREATE TABLE
t=# insert into a values(array['a']),(array['a','b']),(array['a','b','2']);
INSERT 0 3
t=# select * from a;
c
---------
{a}
{a,b}
{a,b,2}
(3 rows)