Usando SQLite em um programa Python
Pergunta
Eu criei um módulo Python que cria e preenche várias tabelas SQLite. Agora, eu quero usá-lo em um programa, mas eu realmente não sei como chamá-lo corretamente. Todos os tutoriais que eu encontrei são essencialmente "inline", ou seja, eles andam através da utilização de SQLite de forma linear ao invés de como realmente usá-lo em produção.
O que estou tentando fazer é ter um cheque método para ver se o banco de dados já está criado. Se assim for, então eu posso usá-lo. Se não, uma exceção é levantada e o programa irá criar o banco de dados. (Ou usar if / else, o que for melhor).
Eu criei um script de teste para ver se a minha lógica está correta, mas ele não está funcionando. Quando eu criar a instrução try, ele apenas cria um novo banco de dados ao invés de verificar se já existe. A próxima vez que eu executar o script, eu recebo um erro que a tabela já existe, mesmo se eu tentasse pegar a exceção. (Eu não usei try / exceto antes, mas percebi que isso é um bom momento para aprender).
Existem bons tutoriais para usar SQLite operacionalmente ou quaisquer sugestões sobre como este código? Eu olhei através do tutorial pysqlite e outros que eu encontrei, mas eles não resolver esta questão.
Solução
AFAIK um banco de dados SQLite é apenas um arquivo. Para verificar se existe o banco de dados, para verificar a existência de arquivos.
Quando você abre um banco de dados SQLite que criará automaticamente um, se o arquivo que apoia-lo não está no lugar.
Se você tentar abrir um arquivo como um banco de dados sqlite3 que não é um banco de dados, você receberá o seguinte:
"sqlite3.DatabaseError: arquivo é criptografado ou não é um banco de dados"
de modo a verificar para ver se o arquivo existe e também certificar-se para tentar capturar a exceção no caso do arquivo não é um banco de dados sqlite3
Outras dicas
Não faça isso mais complexa do que precisa ser. As grandes, bancos de dados independentes têm complexos requisitos de instalação e configuração. SQLite é apenas um arquivo que você acessar com SQL, é muito mais simples.
Faça o seguinte.
-
Adicionar uma tabela para o banco de dados de "componentes" ou "versões" ou "Configuração" ou "Release" ou algo administrativa assim.
CREATE TABLE REVISÃO ( RELEASE_NUMBER CHAR (20) );
-
Em seu aplicativo, se conectar ao seu banco de dados normalmente.
- Executar uma consulta simples contra a mesa de revisão. Aqui está o que pode acontecer.
- A consulta falha ao executar:. Seu banco de dados não existe, então executar uma série de instruções CREATE para construí-lo
- A consulta tiver êxito, mas não retorna nenhuma linha ou o número da versão é menor do que o esperado: existe o banco de dados, mas está fora de data. Você precisa migrar de que a liberação para a versão atual. Esperançosamente, você tem uma seqüência de GOTA, CREATE e ALTER para fazer isso.
- A consulta for bem sucedida, e o número da versão é o valor esperado. Não fazer nada mais, seu banco de dados está configurado corretamente.
SQLite cria automaticamente o arquivo de banco de dados na primeira vez que tentar usá-lo. As instruções SQL para criar tabelas pode usar IF NOT EXISTS
para fazer os comandos só terão efeito se a tabela não foi criada Desta forma, você não precisa verificar para a existência do banco de dados de antemão:. SQLite pode cuidar disso para você
A principal coisa que eu ainda estaria preocupado é que a execução CREATE TABLE IF EXISTS
para cada transação web (digamos) seria ineficiente; você pode evitar que, por ter o programa de manter uma variável (em memória) dizendo se criou o banco de dados hoje, então ele é executado o script CREATE TABLE
uma vez por executar. Isso ainda permitiria que você exclua o banco de dados e começar de novo durante a depuração.
Como @diciu apontou, o arquivo de banco de dados será criado por sqlite3.connect . Se você quer tomar uma ação especial quando o arquivo não está lá, você tem que verificar explicitamente existência:
import os
import sqlite3
if not os.path.exists(mydb_path):
#create new DB, create table stocks
con = sqlite3.connect(mydb_path)
con.execute('''create table stocks
(date text, trans text, symbol text, qty real, price real)''')
else:
#use existing DB
con = sqlite3.connect(mydb_path)
...
- Sqlite não lançar uma exceção se você criar um novo banco de dados com o mesmo nome, ela só vai se conectar a ele. Desde SQLite é um banco de dados baseado em arquivo, sugiro-lhe apenas verificar a existência do arquivo.
- Sobre o segundo problema, para verificar se uma tabela já foi criado, apenas capturar a exceção. Uma exceção "sqlite3.OperationalError: tabela de teste já existe". É lançada se a tabela já existe
import sqlite3
import os
database_name = "newdb.db"
if not os.path.isfile(database_name):
print "the database already exist"
db_connection = sqlite3.connect(database_name)
db_cursor = db_connection.cursor()
try:
db_cursor.execute('CREATE TABLE TEST (a INTEGER);')
except sqlite3.OperationalError, msg:
print msg
Fazendo SQL em geral é horrível em qualquer língua que eu já pegou. Sqlalchemy tem mostrado ser mais fácil a partir deles para usar, porque consulta real e cometer com ele é tão limpo e ausente de problemas.
Aqui está alguns passos básicos sobre realmente usando sqlalchemy em seu aplicativo, melhores detalhes podem ser encontrados a partir da documentação.
- fornecer definições de tabela e criar ORM-mapeamentos
- banco de dados de carga
- pedir-lhe para criar tabelas a partir das definições (não vai fazê-lo se existirem)
- criar fabricante de sessão (opcional)
- criar sessão
Depois de criar uma sessão, você pode cometer e consulta a partir do banco de dados.
Veja esta solução no SourceForge que cobre a sua pergunta de forma tutorial, com código fonte instrutiva:
módulo y_serial.py :: armazém Python objetos com SQLite
"serialização + persistência :: em poucas linhas de código, compressa e anotar Python objetos em SQLite; em seguida, mais tarde recuperá-los em ordem cronológica por palavras-chave sem qualquer SQL mais úteis. 'Módulo padrão' para um banco de dados para dados sem esquema de loja . "
Sim, eu estava nuking o problema. Tudo o que eu precisava fazer era de verificação do arquivo e pegar o IOError se ele não existisse.
Obrigado por todas as outras respostas. Eles podem vir a calhar no futuro.