@janb14: Datenbanken sind auf so etwas nicht vorbereitet. Die gesamte Programmierung von so einem Datenbanksystem ist auf feste Schemata ausgelegt. Es gibt nicht einmal einen standardisierten Weg die vorhandenen Tabellen aufzulisten. Dein 'SHOW TABLES' ist da also auch schon keine so gute Idee weil es kein Standard-SQL ist.
Es ist nicht vorgesehen dass Tabellennamen in SQL als Variablen angegeben werden können, das geht nur bei Werten. Dass Deine `cursor.execute()`-Zeilen funktionieren ist Zufall, sehr wahrscheinlich weil das `MySQLdb`-Modul an der Stelle intern tatsächlich einfach nur die Werte auf sichere Art auf Client-Seite in die Zeichenkette formatiert, und nichts Intelligenteres macht. Das dürfte so bei den meisten Datenbankmodulen nicht funktionieren. Bei SQLite führt das zum Beispiel zu einer Ausnahme:
Code: Alles auswählen
In [13]: con = sqlite3.connect(':memory:')
In [14]: cursor = con.cursor()
In [15]: cursor.execute('CREATE TABLE ?(id INTEGER)', ('test_table',))
---------------------------------------------------------------------------
OperationalError Traceback (most recent call last)
<ipython-input-15-ca7574adeaf6> in <module>()
----> 1 cursor.execute('CREATE TABLE ?(id INTEGER)', ('test_table',))
OperationalError: near "?": syntax error
Oder auch bei MySQL wenn man MySQL-Connector statt MySQLdb verwendet:
Code: Alles auswählen
In [25]: cursor.execute('SELECT * FROM %s', ('test',))
---------------------------------------------------------------------------
ProgrammingError Traceback (most recent call last)
<ipython-input-25-1ac40d2302cc> in <module>()
----> 1 cursor.execute('SELECT * FROM %s', ('test',))
/usr/lib/pymodules/python2.7/mysql/connector/cursor.pyc in execute(self, operation, params)
312 stmt = operation
313
--> 314 res = self.db().protocol.cmd_query(stmt)
315 self._handle_result(res)
316 except (UnicodeDecodeError,UnicodeEncodeError), e:
/usr/lib/pymodules/python2.7/mysql/connector/protocol.pyc in deco(*args, **kwargs)
134 except:
135 pass
--> 136 return func(*args, **kwargs)
137
138 return deco
/usr/lib/pymodules/python2.7/mysql/connector/protocol.pyc in cmd_query(self, query)
477 pkt = self._pkt_make_command(ServerCmd.QUERY,query)
478 self.conn.send(pkt,self.next_pktnr)
--> 479 return self.handle_cmd_result(self.conn.recv())
480 except:
481 raise
/usr/lib/pymodules/python2.7/mysql/connector/connection.pyc in recv_plain(self)
177 buf = self.buffer.popleft()
178 if buf[4] == '\xff':
--> 179 errors.raise_error(buf)
180 else:
181 return buf
/usr/lib/pymodules/python2.7/mysql/connector/errors.pyc in raise_error(buf)
80 % e)
81 else:
---> 82 raise get_mysql_exception(errno,errmsg)
83
84 class ClientError(object):
ProgrammingError: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''test'' at line 1