Oi Vinicius --
Formatar a string como uma string normal de Python funciona -
você está fazendo isso numa das tentativas que descreveu acima, mas
provavelmente
ao tentar dessa forma, esqueceu de alguma outra coisa:
>>> import sqlite3
>>> con = sqlite3.connect("teste.db")
>>> nome = "tabela1"
>>>
>>> con.execute("""CREATE TABLE %s (x INTEGER, y INTEGER) """ % nome)
<sqlite3.Cursor object at 0x7f858dda67a0>
>>> con.commit()
>>>
De fato,a substituição automática feita pela chamada a "execute",
que usa "?" no sqlite,
só funciona para valores a serem inseridos no banco, e não para outros
parâmetros do banco.
É vital que ela seja usada, pois essa substituição impede a maioria
dos casos de injeção de SQL,
escapando corretamente os " ' " e outros parágrafos.
Para utilização de outros parâmetros de forma dinâmica (nomes de
tabelas, colunas,
e parâmetros em algumas das cláusulas de SQL, no entanto, a
substituição feita pelo "execute"
não funciona - nesse caso você pode usar a formatação normal do
Python, com " %" ou com o método format,
PORÉM, sempre certifique-se de que não há possibilidade dos parâmetros
que você está inserindo
não conterem injeção de SQL - a DP-API não inclui um método de escape
"genérico" - então,
principalmente se seus valores vierem do usuário do programa verifique
você mesmo, usando expressões
regulares ou outro meio, a existência de caractéres " ' ", " ( ) ; "
dentre outros (acredito que em geral serão nomes internos,
codificados no programa, e só usados dinâmicamente nas queries, nesse
caso, isso não é necessário)