如何将多个项目添加到列SQLite3中?

时间:2020-06-15 18:41:55

标签: python-3.x list sqlite

我不想使用像pickle这样的不同python包。 我也不想使用多个数据库。

那么,如何将列表或元组添加到数据库的列中?

我有一种理论,即添加一个类似于'(val1, val2, val3)'的字符串,然后使用exec将其放入变量中,但它牵强的东西太多了,肯定有更好,更有效的方法这样的方式。

编辑: 我将添加一些有关所需内容的更多信息。

我想获取(并添加)具有此类信息的列表:

{'pet':'name','type':'breed/species_of_pet', 'img':img_url, 'hunger':'100'} 我希望此字典位于pets列中。 每个宠物可以拥有许多主人(多对多关系)

2 个答案:

答案 0 :(得分:1)

如果您想拥有一个用户表,并且每个用户都可以养宠物。您首先要做一个宠物桌。

create table pets (
  id integer primary key,
  name text not null,
  hunger int not null default 0
);

然后,这取决于宠物是只有一个所有者(称为一对多关系)还是有多个所有者(称为多对多关系)。


如果宠物有一个所有者,则将带有用户ID的列添加到宠物表。这是foreign key

create table pets (
  id integer primary key,
  -- When a user is deleted, their pet's user_id will be set to null.
  user_id integer references users(id) on delete set null,
  name text not null,
  hunger int not null default 0
);

要获得一个用户的所有宠物……

select pets.*
from pets
where user_id = ?

要获取宠物主人的姓名,我们进行join,使用pets.user_idusers.id将宠物的每一行与其主人的行进行匹配。

select users.name
from users
join pets on pets.user_id = users.id
where pets.id = ?

如果每个宠物可以有许多所有者,并且是多对多关系,则我们不会将user_id放入宠物中。相反,我们需要一个额外的表:一个联接表。

create table pet_owners (
  -- When a user or pet is deleted, delete the rows relating them.
  pet_id integer not null references pets(id) on delete cascade,
  user_id integer not null references users(id) on delete cascade
);

我们通过插入此表来声明用户拥有宠物。

-- Pet 5 is owned by users 23 and 42.
insert into pet_owners (pet_id, user_id) values (5, 23), (5, 42);

要查找用户的宠物及其名称,我们查询pet_owners并与宠物一起获得名称。

select pets.*
from pet_owners
join pets on pet_owners.pet_id = pets.id
where user_id = ?

这似乎很奇怪和尴尬,但这就是为什么SQL数据库如此强大和快速的原因。这样做是为了避免对数据库中的内容进行任何解析或解释。这允许数据库使用indexes高效地查询数据,而不必筛选所有数据。这甚至可以使非常大的数据库变得高效。

查询select pets.* from pets where user_id = ?时,由于索引了外键,因此SQLite不会搜索整个pets表。它使用user_id上的索引直接跳转到匹配的记录。这意味着该数据库将对10或1000万只宠物执行相同的操作。

答案 1 :(得分:0)

没有什么可以阻止您在SQLite中存储JSON或其他类似数组的文本;只是这样做时查询起来要困难得多。 SQLite确实有facilities for manipulating JSON,但总的来说,我可能会倾向于@Schwern的解决方案。