Add columns to an SQLite table in a Python loop -
i make database (using sqlite3) scientific program (python). program build makes loops gradually build database. problem add column loop. made example. shows problem variable defines new column name (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''')
does have advice solve problem please ? , have nice day.
string literals must terminated same sort of quoting started them. "+name1+"
interpreted literal part of strings , passed on c.execute(...)
without variable name1
being inserted.
thus both new columns have literal name +name1+
, leads error message
sqlite3.operationalerror: duplicate column name: +name1+
you wanted like:
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''')
rewritten loop, that'd be
import sqlite3 conn = sqlite3.connect(':memory:') c = conn.cursor() c.execute('''create table tablename (var1 real, var2 real)''') column_name in ['test1', 'test2']: c.execute('''alter table tablename add column ''' + column_name + ''' integer''')
to avoid risk of sql injections, you shouldn't string concatenation or manipulation on sql query or command, though. instead use parameter substitution python's database api offers:
import sqlite3 conn = sqlite3.connect(':memory:') c = conn.cursor() c.execute('''create table tablename (var1 real, var2 real)''') column_name in ['test1', 'test2']: c.execute('''alter table tablename add column ? integer''', (column_name,))
in fact, api make 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)
Comments
Post a Comment