Logo Hardware.com.br
urbanus
urbanus Super Participante Registrado
518 Mensagens 53 Curtidas

[Resolvido] Consulta SQLite

#1 Por urbanus 30/03/2011 - 15:27
Desenvolvo uma agenda telefônica em Tkinter com o banco de dados sqlite3.
Ao pressionar o botão gravar, quando o contato é novo, um novo registro deve ser gerado no banco de dados.
Como posso fazer para verificar se o registro já existe e gravar ou atualizar, caso já exista, sem ter que recorrer a uma gambiarra de código com múltiplas consultas e ifs?
Responder
Kakao
Kakao Super Participante Registrado
645 Mensagens 23 Curtidas
#3 Por Kakao
31/03/2011 - 06:12
Crie a tabela com uma chave primária. E aí você tenta fazer a inserção dentro de um try. Se o adaptador levantar a exceção IntegrityError você captura e trata. Olha o exemplo do manual:


import sqlite3

con = sqlite3.connect(":memory:&quot
con.execute("create table person (id integer primary key, firstname varchar unique)&quot

# Successful, con.commit() is called automatically afterwards
with con:
con.execute("insert into person(firstname) values (?)", ("Joe",))

# con.rollback() is called after the with block finishes with an exception, the
# exception is still raised and must be catched
try:
with con:
con.execute("insert into person(firstname) values (?)", ("Joe",))
except sqlite3.IntegrityError:
print "couldn't add Joe twice"
Delphing
Delphing Geek Registrado
2.1K Mensagens 96 Curtidas
#5 Por Delphing
31/03/2011 - 18:47
Outra forma quando não há a possibilidade de criação de chaves primárias ou o uso de índices para verificação, é possível fazer um SELECT antes de inserir, se retornar UM registro que seja ou vários, quer dizer que já existe determinado registro, e então basta barrar, dizendo que já existem registros com essas informações.

Abraço
http://www.dotclass.com.br
punk.gif

"Se correr o bicho pega se ficar o bicho come mas se unir o bicho foge."
Mário Sérgio Cortella
http://www.youtube.com/watch?v=IQ9MkP7XWcA

"Para conquistar o que deseja, precisa ser quem é! Do contrário o desejo não é teu a conquista não é tua." by Eu legal.png
urbanus
urbanus Super Participante Registrado
518 Mensagens 53 Curtidas
#6 Por urbanus
31/03/2011 - 23:11
Delphing disse:
Outra forma quando não há a possibilidade de criação de chaves primárias ou o uso de índices para verificação, é possível fazer um SELECT antes de inserir, se retornar UM registro que seja ou vários, quer dizer que já existe determinado registro, e então basta barrar, dizendo que já existem registros com essas informações.

Abraço


Delphing, é exatamente isso que eu quero evitar.
Vendo câmera Nikon D3000, pouco uso, lente 18-55mm, por R$ 800,00 + frete.
Kakao
Kakao Super Participante Registrado
645 Mensagens 23 Curtidas
#11 Por Kakao
01/04/2011 - 19:10
Detalhe: não é o módulo que define os métodos __enter__ e __exit__ e sim a classe. Por exemplo a classe Connection do sqlite3:


>>> dir(sqlite3.Connection)
['DataError', 'DatabaseError', 'Error', 'IntegrityError', 'InterfaceError', 'InternalError', 'NotSupportedError', 'OperationalError', 'ProgrammingError', 'Warning', '__call__', '__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'commit', 'create_aggregate', 'create_collation', 'create_function', 'cursor', 'execute', 'executemany', 'executescript', 'interrupt', 'isolation_level', 'iterdump', 'rollback', 'row_factory', 'set_authorizer', 'set_progress_handler', 'text_factory', 'total_changes']
Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal