将从 HTML 页面检索到的值存储在 sqlite 数据库的不同行中

Storing the values retrieved from HTML page in different rows in sqlite database

我有一个包含多个值的字符串。检索时,我想将它存储在 sqlite3 数据库中的不同行中。例如:

curr.execute('''INSERT INTO cars VALUES(?,?,?)''', (str(red), str(black),str(white),))

在上面,我有一个名为 cars 的 table,它具有名为红色、黑色和白色的三列。他们每个人都有一组特定的检索值,比如红色有值 a、b、c 等等。现在,当我尝试将 a、b、c 存储在数据库中时,它被存储在一行中。数据库应如下所示(预期):


 red    |  black  |  white
  a     |    d    |    g
  b     |    e    |    h
  c     |    f    |    i

但是现在的样子是:

  red    |  black   |   white
  a,b,c  |  d,e,f   |  g,h,i
         |          |

类似地,对于黑色列,其中检索到的一组值将是 d、e、f,我希望这些值 (d、e、f) 位于不同的行中,而不是单行中。白色列也一样。

此外,如果我不将其作为字符串传递,我将不得不单独存储值,如下所示:

curr.execute('''INSERT INTO cars VALUES(?,?,?)''', (red[1]), black[1],white[1],))

这会将值存储在不同的行中,但是当数据很大时它会变得乏味。有什么方法可以存储在不同的行中吗?

提前致谢

如果我理解正确你的问题,你可以这样做

import sqlite3


DDL = """\
CREATE TABLE test (
    red text,
    black text,
    white text
)"""


DML = """INSERT INTO test (red, black, white) VALUES (?, ?, ?)"""

QRY = """SELECT red, black, white FROM test"""

reds = 'abc'
blacks = 'def'
whites = 'ghi'


with sqlite3.connect(':memory:') as conn:
    cur = conn.cursor()
    cur.execute(DDL)

    data = list(zip(reds, blacks, whites))

    cur.executemany(DML, data)
    conn.commit()

    cur.execute(QRY)
    for row in cur.fetchall():
        print(row)

输出:

('a', 'd', 'g')
('b', 'e', 'h')
('c', 'f', 'i')

关键要素是使用 zip to create tuples of the matching elements of each row, and using cursor.executemany 在一行代码中插入元组。

如果输入的长度不同,您可以使用 itertools.zip_longest 而不是 zip。这里我们使用 None 作为替换缺失元素的填充值,但如果更合适,您可以提供一个字符串(例如“MISSING”)。

from itertools import zip_longest

...

reds = 'abc'
blacks = 'de'
whites = 'g'


with sqlite3.connect(':memory:') as conn:
    cur = conn.cursor()
    cur.execute(DDL)

    data = list(zip_longest(reds, blacks, whites, fillvalue=None))
    
    ...

输出:

('a', 'd', 'g')
('b', 'e', None)
('c', None, None)