【问题标题】:Storing the values retrieved from HTML page in different rows in sqlite database将从 HTML 页面检索到的值存储在 sqlite 数据库的不同行中
【发布时间】:2021-04-20 17:59:40
【问题描述】:

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

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

在上面我有一个名为 cars 的表,它有三个名为 red、black 和 white 的列。他们每个人都有一组特定的检索值,比如红色有值 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],))

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

提前致谢

【问题讨论】:

    标签: python python-3.x sqlite sql-insert


    【解决方案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创建每行匹配元素的元组,并使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-30
      • 2016-10-10
      • 1970-01-01
      • 2011-12-30
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多