Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有列名列表的Python Sqlite3插入操作_Python_Python 2.7_Sqlite - Fatal编程技术网

具有列名列表的Python Sqlite3插入操作

具有列名列表的Python Sqlite3插入操作,python,python-2.7,sqlite,Python,Python 2.7,Sqlite,通常,如果我想在表中插入值,我会这样做(假设我知道要插入的值属于哪些列): 但现在我有了一个列列表(列表的长度可能不同)和列表中每列的值列表 例如,如果我有一个包含10列的表(即column1、column2…、column10等)。我有一个要更新的列列表。比如说[column3,column4]。我有这些列的值列表[第3列的值,第4列的值] 如何将列表中的值插入到各自所属的各个列中?据我所知,conn.execute中的参数列表仅适用于值,因此我们必须使用如下字符串格式: import sql

通常,如果我想在表中插入值,我会这样做(假设我知道要插入的值属于哪些列):

但现在我有了一个列列表(列表的长度可能不同)和列表中每列的值列表

例如,如果我有一个包含10列的表(即column1、column2…、column10等)。我有一个要更新的列列表。比如说
[column3,column4]
。我有这些列的值列表<代码>[第3列的值,第4列的值]


如何将列表中的值插入到各自所属的各个列中?

据我所知,
conn.execute
中的参数列表仅适用于值,因此我们必须使用如下字符串格式:

import sqlite3
conn = sqlite3.connect(':memory:')
conn.execute('CREATE TABLE t (a integer, b integer, c integer)')
col_names = ['a', 'b', 'c']
values = [0, 1, 2]
conn.execute('INSERT INTO t (%s, %s, %s) values(?,?,?)'%tuple(col_names), values)
请注意这是一次非常糟糕的尝试,因为传递到数据库的字符串应始终检查注入攻击。但是,您可以在插入之前将列名列表传递给某个注入函数

编辑:
对于不同长度的变量,您可以尝试以下操作

exec_text = 'INSERT INTO t (' + ','.join(col_names) +') values(' + ','.join(['?'] * len(values)) + ')'
conn.exec(exec_text, values)
# as long as len(col_names) == len(values)

当然,字符串格式也可以,你只需要聪明一点就行了

col_names = ','.join(col_list)
col_spaces = ','.join(['?'] * len(col_list))
sql = 'INSERT INTO t (%s) values(%s)' % (col_list, col_spaces)
conn.execute(sql, values)

我正在寻找一种基于未知/可变长度列表创建列的解决方案,并发现了这个问题。然而,我设法找到了一个更好的解决方案(无论如何对我来说),这也有点现代,所以我想我应该包括它,以防它对某人有帮助:

import sqlite3

def create_sql_db(my_list):

    file = 'my_sql.db'
    table_name = 'table_1'
    init_col = 'id'
    col_type = 'TEXT'

    conn = sqlite3.connect(file)
    c = conn.cursor()

    # CREATE TABLE (IF IT DOESN'T ALREADY EXIST)
    c.execute('CREATE TABLE IF NOT EXISTS {tn} ({nf} {ft})'.format(
        tn=table_name, nf=init_col, ft=col_type))

    # CREATE A COLUMN FOR EACH ITEM IN THE LIST
    for new_column in my_list:
        c.execute('ALTER TABLE {tn} ADD COLUMN "{cn}" {ct}'.format(
            tn=table_name, cn=new_column, ct=col_type))

    conn.close()


my_list = ["Col1", "Col2", "Col3"]

create_sql_db(my_list)
我所有的数据都是text类型的,所以我只有一个变量“col_type”-但是你可以输入一个元组列表(或者元组的元组,如果你喜欢的话):

并将“创建列”步骤更改为:

for tupl in my_other_list:

    new_column = tupl[0]   # "ColA", "ColB", "ColC"
    col_type = tupl[1]     # "TEXT", "INTEGER", "BLOB"

    c.execute('ALTER TABLE {tn} ADD COLUMN "{cn}" {ct}'.format(
        tn=table_name, cn=new_column, ct=col_type))

在代码示例中,您编写了“VALUES(?,)”,其中似乎缺少一个问号,因为您试图传递三个值。@starrify typo,但这只是一个示例是的,我只是指出了typo xd,但我的问题是列表的长度总是会改变。有时我可能需要只更改2列,有时更改3到4列。所以,字符串格式对我不起作用。但是谢谢你的帮助。@ChrisAung我只提供一个简单的例子。。对于不同的长度列表,您可以尝试
“插入到t(+','。连接(列名称)+')值(+','。连接(['?']*len(值))+',“值”
,而
len(列名称)==len(值)
请不要忘记
值(?,?)
对于长度不是3:D的列列表不起作用
my_other_list = [("ColA", "TEXT"), ("ColB", "INTEGER"), ("ColC", "BLOB")]
for tupl in my_other_list:

    new_column = tupl[0]   # "ColA", "ColB", "ColC"
    col_type = tupl[1]     # "TEXT", "INTEGER", "BLOB"

    c.execute('ALTER TABLE {tn} ADD COLUMN "{cn}" {ct}'.format(
        tn=table_name, cn=new_column, ct=col_type))