将可变长度数组写入数据库

时间:2017-12-13 14:39:15

标签: python-3.x postgresql

我处理一个文章列表,每个文章都包含可变数量的标签。如果我不知道有多少标签可以用于以后的更新,如何将标签列表存储在列中?我第一次可以通过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,))

2 个答案:

答案 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)