在Python循环中向SQLite表添加列

31moq8wy  于 2022-11-15  发布在  SQLite
关注(0)|答案(1)|浏览(302)

我为一个科学程序(Python)创建了一个数据库(使用SQLITE3)。这个程序构建会生成循环,这些循环会逐渐构建数据库。因此,问题是使用循环添加列。我以身作则。它表明问题出在定义新列名(Name1)的变量上。

import sqlite3
import os

conn=sqlite3.connect(':memory:')
c=conn.cursor()

c.execute('''CREATE TABLE TableName (Var1 REAL, Var2 REAL)''')

Name1='Test1'
c.execute('''ALTER TABLE TableName ADD COLUMN "+Name1+" INTEGER''')
Name1='Test2'
c.execute('''ALTER TABLE TableName ADD COLUMN "+Name1+" INTEGER''')

有谁有解决这个问题的建议吗?谢谢,祝你有愉快的一天。

4smxwvx5

4smxwvx51#

字符串必须以开始它们的相同类型的引号结束。因此,"+Name1+"被解释为字符串的文字部分,并传递给c.execute(...),而不插入变量Name1
因此,这两个新列的文字名称都是+Name1+,这会导致错误消息

sqlite3.OperationalError: duplicate column name: +Name1+

你可能想要这样的东西:

import sqlite3

conn = sqlite3.connect(':memory:')
c = conn.cursor()

c.execute('''CREATE TABLE TableName (Var1 REAL, Var2 REAL)''')

name1 = 'Test1'
c.execute('''ALTER TABLE TableName ADD COLUMN ''' + name1 + ''' INTEGER''')
name1 = 'Test2'
c.execute('''ALTER TABLE TableName ADD COLUMN ''' + name1 + ''' INTEGER''')

用循环重写,那将是

import sqlite3

conn = sqlite3.connect(':memory:')
c = conn.cursor()

c.execute('''CREATE TABLE TableName (Var1 REAL, Var2 REAL)''')

for column_name in ['Test1', 'Test2']:
    c.execute('''ALTER TABLE TableName ADD COLUMN ''' + column_name + ''' INTEGER''')

不过,为了避免SQL注入的风险,you shouldn't do string concatenation or manipulation on the SQL query or command。取而代之的是使用Python数据库API已经提供的参数替换:

import sqlite3

conn = sqlite3.connect(':memory:')
c = conn.cursor()

c.execute('''CREATE TABLE TableName (Var1 REAL, Var2 REAL)''')

for column_name in ['Test1', 'Test2']:
    c.execute('''ALTER TABLE TableName ADD COLUMN ? INTEGER''', (column_name,))

事实上,该API将使显式循环变得不必要:

import sqlite3

conn = sqlite3.connect(':memory:')
c = conn.cursor()

c.execute('''CREATE TABLE TableName (Var1 REAL, Var2 REAL)''')

column_names = [('Test1',), ('Test2',)]
c.executemany('''ALTER TABLE TableName ADD COLUMN ? INTEGER''', column_names)

相关问题