在Python循环中将列添加到SQLite表中

时间:2015-06-13 22:59:38

标签: python sqlite

我为科学程序(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''')

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

1 个答案:

答案 0 :(得分:5)

字符串文字必须以启动它们的相同类型的引号终止。因此,"+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会生成explicit loop unnecessary

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)