【问题标题】:Insert new column with values from a python list into an existing sql table将具有来自 python 列表的值的新列插入现有的 sql 表
【发布时间】:2021-03-21 16:33:07
【问题描述】:

我的问题:我想在现有表中使用 python 列表中的值创建一个新列。我的 SQL 表如下所示:

   gender  age  cholesterol  smoke
        1   13            1      0
        1   45            2      0
        0    1            2      1

我在 python 列表中有值:new_data = [1,2,3] 我想在 SQL 表中创建一个新列,然后用列表中的值填充它。所以决赛桌应该是这样的:

   gender  age  cholesterol  smoke  new_data
        1   13            1      0         1
        1   45            2      0         2
        0    1            2      1         3

到目前为止:我尝试创建一个新列,然后尝试传递值:

import sqlite3
con = sqlite3.connect('database.db')
curs = con.cursor()
curs.execute('''ALTER TABLE demo ADD COLUMN new_date''')
con.commit()
new_data = [1,2,3]
curs.execute("INSERT INTO demo(new_date) VALUES(?)", new_data))

但它不起作用并给出这个错误:

ProgrammingError: Incorrect number of bindings supplied.

我该怎么办?

这里是示例数据的转储

df = pd.DataFrame(data = {'gender' :      [1,  1,  0],
                          'age' :         [13, 45, 1],
                          'cholesterol' : [1,  2,  2],
                          'smoke' :       [0,  0,  1]
                          })

【问题讨论】:

  • 这是不可能的 - INSERT INTO 用于创建新行而不是向现有行添加数据。
  • 那么,我应该使用@norie 什么函数?
  • 你的 SQLite 版本是多少?
  • sqlite3.sqlite_version: 3.33.0 @forpas

标签: python sql sqlite


【解决方案1】:

您必须在添加新列后更新表格,而不是插入新行。

而不是列表new_data = [1,2,3]传递列表列表new_data = [[1, 1], [2, 2], [3, 3]],每个列表的第二项是将要更新的行的行号。
因此,如果您想使用值 100、150、250 更新列,那么 new_data 应该是 new_data = [[100, 1], [150, 2], [250, 3]]

UPDATE 语句将有一个 WHERE 子句,用于检查每次应该更新哪一行:

new_data = [[1, 1], [2, 2], [3, 3]]
sql = """
UPDATE demo AS d
SET new_data = ?
WHERE (SELECT COUNT(*) FROM demo dd WHERE dd.rowid <= d.rowid) = ?
"""
curs.executemany(sql, new_data)
con.commit() 

由于您的 SQLite 版本是 3.33.0,您还可以在 UPDATE 语句中使用 UPDATE...FROM 语法:

sql = """
UPDATE demo AS d1
SET new_data = ?
FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY rowid) rn FROM demo) AS d2
WHERE d2.rowid = d1.rowid AND rn = ?
""" 

【讨论】:

  • 谢谢!顺便说一句,我更新了我的 SQLite 版本,语法更友好!
猜你喜欢
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
相关资源
最近更新 更多