【问题标题】:How to add multiple items into a column SQLite3?如何将多个项目添加到 SQLite3 列中?
【发布时间】:2020-10-05 06:08:32
【问题描述】:

我不想使用不同的 python 包,比如 pickle。 我也不想使用多个数据库。

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

我有一个理论,即添加一个类似于 '(val1, val2, val3)' 的字符串,然后使用 exec 将其放入变量中,但这太牵强了,肯定有更好、更有效的方法来做到这一点.

编辑: 我将添加更多关于我正在寻找的信息。

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

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

【问题讨论】:

  • 每只宠物有一个主人还是多个主人?
  • 多个所有者。

标签: python-3.x list sqlite


【解决方案1】:

如果你想有一个 users 表并且每个用户都可以有宠物。你首先要做一个宠物桌。

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

那么这取决于宠物是只有一个主人(称为一对多关系)还是有多个主人(称为多对多关系)。


如果宠物有一个主人,则将带有用户 ID 的列添加到 pets 表中。这是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 = ?

为了获取宠物主人的姓名,我们使用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 万只宠物执行相同的操作。

【讨论】:

  • 谢谢。但我真的不想在数据库中创建更多表。有没有什么办法可以在没有多个表的情况下做到这一点?
  • @12944qwerty 是的,您可以将元组和字典作为字符串塞入其中,但这会很慢且有问题,并且需要大量额外的代码。 SQL 用于关系数据库,您需要宠物与其主人之间的关系。另一种方法是NoSQL database 或 MySQL 中的 JSON 列或Postgres。但是,这些并不适合您的问题。我们使用 SQL 已有 50 年的历史,并将继续使用下去,这是有充分理由的。这是值得的。
  • 我正在尝试将其合并到一个不和谐的机器人中。所以对于references,就像你在那里做的那样,我可以做references users(id) and users(guild_id)吗?
  • 另外,create pet_owners 不应该是create table pet_owners吗?
  • @12944qwerty 是的,应该是create table pet_owners。你只需要引用一个表的主键,不需要引用额外的列。你想通过引用users(guild_id)来做什么?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多