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.

Foi útil?

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.

  1. 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) );

  2. Em seu aplicativo, se conectar ao seu banco de dados normalmente.

  3. 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 . "

http://yserial.sourceforge.net

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top