1

我有一个字典,其中包含一个 itemID 作为键,然后是一堆像这样的对:

(91311703, [(3300, 2), (3301, 3), (3327, 3), (3330, 2), (3386, 2), (3392, 2), (3
402, 3), (3413, 3), (3426, 3), (3449, 3)])

每对中的第一个数字是唯一的 ID 号,第二个数字是 1-5 之间的值。我想使用 sqlite3 将其写入表中,以便在此示例中,有一行 itemID 为 91311703,然后在 3300 列中的值为 2,在 3301 列中为 3,在 3327 列中为 3,等等

不同之处在于,该表将包含每个可能的 ID 号的列,总共大约 200-300 个。如果我传递的 dict 不包含 ID 号,我希望它为该列输入 0,因此在此示例中,列 3302-3326、3328、3329、3331-3385 等都将获得 0 值。

我想到的一种可能性是为每列创建默认值为 0 的表,然后当我传入 dict 时,它只会更新它包含的 ID 号列的值。不过,这似乎是一种糟糕的编码方式,所以我愿意接受建议。另一种选择是ifelse如果在字典中找到 ID 号,则使用其对中的值,否则使用 0,但这似乎也不是一个很好的方法。

我需要什么 Python + sqlite3 代码来查看此字典并将值分配给与此字典中的对中的 ID 号匹配的列?对于在字典中找不到 ID 号的那些列,您有什么建议?我的目标是每个 itemID 有一行(即我的字典中每个键 1 行。)

4

1 回答 1

1

您可以动态创建 SQL,仅设置实际需要的那些列:

INSERT INTO MyTable (itemID, col3300, col3301, col3327, col3330, ...)
VALUES (91311703, 2, 3, 3, 2, ...)

或对所有列使用命令,并将未使用的列设置为0

INSERT INTO MyTable (itemID, col3300, col3301, col3302, col3303, ...)
VALUES (91311703, 2, 3, 0, 0, ...)

但是,如果有许多未使用的值,则此表结构将效率低下。

正确规范化后,您将拥有一个只有三列的表,其中包含项目 ID、ID 和值的所有有效组合:

INSERT INTO MyTable(itemID, ID, value)
VALUES (91311703, 3300, 2),
       (91311703, 3301, 3),
       (91311703, 3327, 3),
       (91311703, 3330, 2),
       ...

这些组织中的哪一个更适合您取决于您​​要运行的查询类型。

于 2012-11-21T20:47:20.957 回答