When I run the SQL query below I get the error print(db.execute(“SELECT * FROM (?);”), (tableName)) sqlite3.OperationalError: near “?”: syntax error
x
db = sqlite3.Connection(":memory:")
db.execute("CREATE TABLE Students(name);")
tableName = "Students"
var1 = "Jon"
var2 = "Steve"
var3 = "Chuckie"
db.execute("INSERT INTO Students VALUES (?), (?), (?)", (var1, var2, var3))
print(db.execute("SELECT * FROM (?);"), (tableName))
What is the correct way to pass in parameters to a SQL query?
Advertisement
Answer
You can’t dynamically bind object names in SQL, only values. For such a behavior, you’ll have to resort to string manipulation:
queryTemplate = 'SELECT * FROM %s'
tableName = 'Students'
query = queryTemplate % tableName
print(query)
EDIT:
To address the concerns in the comment – yes, this technique is indeed more vulnerable to SQL Injection attacks. The common practice to protect against SQL Injection in such scenarios is to use a whitelist of allowed tables.
E.g.:
allowedTables = ['students', 'teachers']
if tableName not in allowedTables:
raise ValueError('Wrong table')