我为科学程序(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''')
有人有建议解决这个问题吗? 谢谢你,祝你有个愉快的一天。
答案 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)