我不想使用像pickle这样的不同python包。 我也不想使用多个数据库。
那么,如何将列表或元组添加到数据库的列中?
我有一种理论,即添加一个类似于'(val1, val2, val3)'
的字符串,然后使用exec
将其放入变量中,但它牵强的东西太多了,肯定有更好,更有效的方法这样的方式。
编辑: 我将添加一些有关所需内容的更多信息。
我想获取(并添加)具有此类信息的列表:
{'pet':'name','type':'breed/species_of_pet', 'img':img_url, 'hunger':'100'}
我希望此字典位于pets
列中。
每个宠物可以拥有许多主人(多对多关系)
答案 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_id
和users.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的解决方案。