SQLite - Como inserir variáveis nos módulos de comunicação com banco de dados?

1,880 views
Skip to first unread message

Vinicius Paludo

unread,
Jan 14, 2015, 10:31:30 PM1/14/15
to python...@googlegroups.com
Fala, pessoal, beleza?

Estou trabalhando num projeto de ensaio para melhor aprender Python em conexão com o SQLite. Dentro do projeto, eu precisava criar tabelas automaticamente no BD de acordo com dados informados pelo usuário. No meu esquema, defini variáveis com definições de input, onde o usuário informaria, por exemplo, um domínio; a ideia é que esse domínio pudesse compor o nome de uma nova tabela em CREATE TABLE...

Acontece que eu já tentei todas as formas de inserção de variáveis e parâmetros de entrada que encontrei em tutoriais e livros, e sempre dá erro de sintaxe, mesmo quando os parâmetros de entrada ficam em dados a serem inseridos numa tabela já existente ("""INSERT INTO table (x, y, z) VALUES (?,?,?)""", (a, b, c)).

Mas minha principal dificuldade é inserir uma variável no nome de uma nova tabela: 
Já tantei nestes formatos:

nomedatabela = input("Digite: ")

cursor.execute("""CREATE TABLE ? (x integer, y integer)""", (nomedatabela))
cursor.execute("""CREATE TABLE %s (x integer, y integer)""" %(nomedatabela))
cursor.execute("""CREATE TABLE %s (x integer, y integer)""", (nomedatabela))


Já pesquisei na documentação do SQLite3 e já fucei em tudo, mas não consigo descobrir a sintaxe correta.

É possível fazer esse tipo de inserção? E o que eu estou fazendo de errado?

Andre Fonseca

unread,
Jan 15, 2015, 8:02:04 AM1/15/15
to python...@googlegroups.com
Vinicius,

Se você usar aspas simples ao inves de 3, será que não funciona? 

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
----------------------
Andre Fonseca
http://andrefonseca.net

Paulo Pinheiro

unread,
Jan 15, 2015, 8:25:23 AM1/15/15
to python...@googlegroups.com
Olá, Vinicius.


Primeiro, todos os fabricantes de produtos sql sempre enfatizam 'nunca faça isso', use o nosso esquema de binding e esteja seguro. O sqlite3 em python não é diferente:


# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)

https://docs.python.org/2/library/sqlite3.html

MAS, para resolver o problema que você encontrou, fiz isso em python3 e funcionou:

import sqlite3

nometabela
= input('Por favor, digite o nome da tabela: ')

conn
= sqlite3.connect('example.db')
c
= conn.cursor()

c
.execute('CREATE TABLE {} (date text, trans text, symbol text, qty real, price real)'.format(nometabela))


Em python2, não achei jeito com o bom e velho %s.

Paulo Henrique Rodrigues Pinheiro

unread,
Jan 15, 2015, 9:07:05 AM1/15/15
to python...@googlegroups.com
Olá.


Mais um detalhe: o bom e velho raw_input no lugar de input, resolve a parada.

Paulo Henrique Rodrigues Pinheiro
http://about.me/paulohrpinheiro
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito em um tópico no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse tópico, acesse https://groups.google.com/d/topic/python-brasil/qgGbm75cElI/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus tópicos, envie um e-mail para python-brasi...@googlegroups.com.

Joao S. O. Bueno

unread,
Jan 15, 2015, 9:53:21 AM1/15/15
to Python Brasil
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)

Régis Silva

unread,
Jan 15, 2015, 8:13:06 PM1/15/15
to python...@googlegroups.com
Veja se este tutorial te ajuda.
Tem videos também.

Jose Ribeiro

unread,
Mar 8, 2017, 6:20:24 AM3/8/17
to Python Brasil
Paulo Pinheiro
Boa noite
Você me deu a dica, e que já testei e funcionou perfeitamente, daquilo que estou buscando sem sucesso há muito tempo e estava desacreditado de uma soluçao.
OOOOBBBRRRIIIGGGAAADOOO !!!!!!!!!!!! Obrigado pela sua ajuda !!!!
José

Jose Ribeiro

unread,
Mar 8, 2017, 3:25:13 PM3/8/17
to Python Brasil
a partir do comando me veio a ideia de unir os dois:
nometabela = "Cadastro"

c.execute('CREATE TABLE {} (date text, trans text, symbol text, qty real, price real)'.format(nometabela))
nometabela = "Cadastro"
DMAno = "01/12/2016"
Tran = Opera
Simb = "+"
Gasto = 5
Custo = 10,00
c.execute(""" update  {} set date = :DMAno, trans = :Tran, symbol = :Simb, qty = :Gasto, price = :Custo where qty>1""".format(nometabela),local())
Onde o {} .format(nometabela) substitui usa a variável que contem o nome da tabela e
:Variaveis local() substitui todas as variaveis que tem : pelo valor
Assim complementa todas as substituições das variáveis pelos respectivos valores dentro do comando SQL no SQLite
José


Em quinta-feira, 15 de janeiro de 2015 11:25:23 UTC-2, Paulo Pinheiro escreveu:

Jose Ribeiro

unread,
Mar 8, 2017, 7:22:01 PM3/8/17
to Python Brasil
Fazendo uma correção:
locals()  Na empolgação faltou o "s" da função
José


Em quarta-feira, 8 de março de 2017 17:25:13 UTC-3, Jose Ribeiro escreveu:
a partir do comando me veio a ideia de unir os dois:
nometabela = "Cadastro"
c.execute('CREATE TABLE {} (date text, trans text, symbol text, qty real, price real)'.format(nometabela))
nometabela = "Cadastro"
DMAno = "01/12/2016"
Tran = Opera
Simb = "+"
Gasto = 5
Custo = 10,00
c.execute(""" update  {} set date = :DMAno, trans = :Tran, symbol = :Simb, qty = :Gasto, price = :Custo where qty>1""".format(nometabela),locals())

Onde o {} .format(nometabela) substitui usa a variável que contem o nome da tabela e
:Variaveis locals() substitui todas as variaveis que tem : pelo valor

Jose Ribeiro

unread,
Mar 8, 2017, 7:22:51 PM3/8/17
to Python Brasil
Reply all
Reply to author
Forward
0 new messages