Como, de forma confiável , verifico no SQLite se existe uma tabela de usuário específica?
Não estou pedindo formas não confiáveis, como verificar se um "select *" na tabela retornou um erro ou não (isso é uma boa idéia?).
O motivo é o seguinte:
No meu programa, preciso criar e preencher algumas tabelas se elas ainda não existirem.
Se eles já existirem, preciso atualizar algumas tabelas.
Em vez disso, devo seguir outro caminho para sinalizar que as tabelas em questão já foram criadas - por exemplo, criando / colocando / definindo um determinado sinalizador no meu arquivo de inicialização / configurações do programa no disco ou algo assim?
Ou minha abordagem faz sentido?
sqlite3.OperationalError
, você deve analisar a mensagem de erro para garantir que seja, por exemplo, a mensagem "table TABLE_NAME já existe" ao criar uma tabela e, se não, reraise o erro e acho que não há garantia de que o fraseado do erro não seja alterado.Respostas:
Perdi a entrada da FAQ.
De qualquer forma, para referência futura, a consulta completa é:
Onde
{table_name}
é o nome da tabela para verificar.Seção de documentação para referência: Formato de arquivo do banco de dados. 2.6 Armazenamento do esquema do banco de dados SQL
fonte
Se você estiver usando o SQLite versão 3.3 ou superior, poderá criar facilmente uma tabela com:
Da mesma maneira, você pode remover uma tabela apenas se ela existir, usando:
fonte
create table
instrução está incompleta (faltando a especificação das colunas da tabela).Uma variação seria usar SELECT COUNT (*) em vez de SELECT NAME, ou seja,
Isso retornará 0, se a tabela não existir, 1 se existir. Isso provavelmente é útil em sua programação, pois um resultado numérico é mais rápido / fácil de processar. A seguir, ilustra como você faria isso no Android usando SQLiteDatabase, Cursor, rawQuery com parâmetros.
fonte
COUNT(*)
) seja fácil de processar, é ainda mais fácil retornar a existência de uma linha ou não; se houver uma linha lá, ela existe; se não houver uma linha, não existe. (Você já verificar se há falha na moveToFirst, de modo que o trabalho seria feito nesse ponto.)Você poderia tentar:
fonte
SQLiteReader reader = cmd.ExecuteReader();
e faça adt.Load(reader)
(ondedt
está aDataTable
). Eu achei que dá essaObject reference is not an instance of an object
exceção no.Load()
se a tabela não for encontrada. Em vez disso, use aeSQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
doadapter.Fill(ds)
, ondeds
é aDataSet
. Você pode ver seds.Tables.Count > 0
ereturn ds.Tables[0];
se sim (ouelse return null
). Em seguida, você pode verificar queDataTable
por sernull
, sedt.Rows != null
, e sedt.Rows.Count>0
Usar:
Se a tabela resultante estiver vazia,
your_table_name
ela não existe.Documentação:
Exemplo de saída:
fonte
Os nomes de tabela SQLite não diferenciam maiúsculas de minúsculas, mas a comparação diferencia maiúsculas de minúsculas por padrão. Para fazer isso funcionar corretamente em todos os casos, você precisa adicionar
COLLATE NOCASE
.fonte
Se você estiver recebendo um erro "a tabela já existe", faça as alterações na string SQL, conforme abaixo:
Dessa forma, você pode evitar as exceções.
fonte
Veja isto :
fonte
Se você estiver usando o fmdb , acho que você pode importar o FMDatabaseAdditions e usar a função bool:
fonte
O código a seguir retorna 1 se a tabela existir ou 0 se a tabela não existir.
fonte
Observe que, para verificar se existe uma tabela no banco de dados TEMP, você deve usar em
sqlite_temp_master
vez desqlite_master
:fonte
Aqui está a função que eu usei:
Dado um objeto SQLDatabase = db
fonte
Use este código:
Se a contagem de matriz retornada for igual a 1, significa que a tabela existe. Caso contrário, não existe.
fonte
Nota: Isso está funcionando agora no meu Mac com o Python 3.7.1
fonte
table_name
não seja fornecido de origem não tratada (como entrada do usuário), caso contrário, estará vulnerável à injeção de SQL. É sempre melhor usar parâmetros, em vez de técnicas de manipulação de texto,Usar
para impedir que todos os registros sejam lidos.
fonte
Você pode escrever a seguinte consulta para verificar a existência da tabela.
Aqui 'table_name' é o nome da sua tabela que você criou. Por exemplo
e verifique
fonte
A maneira mais confiável que encontrei no C # agora, usando o pacote mais recente do sqlite-net-pcl nuget (1.5.231) que usa o SQLite 3, é o seguinte:
fonte
Usar uma consulta SELECT simples é - na minha opinião - bastante confiável. Acima de tudo, ele pode verificar a existência da tabela em muitos tipos diferentes de banco de dados (SQLite / MySQL).
Faz sentido quando você pode usar outro mecanismo confiável para determinar se a consulta foi bem-sucedida (por exemplo, você consulta um banco de dados via QSqlQuery no Qt ).
fonte
A função c ++ verifica o banco de dados e todos os bancos de dados anexados quanto à existência de tabela e (opcionalmente) coluna.
Edit: Descoberto recentemente a função sqlite3_table_column_metadata. Conseqüentemente
fonte
Este é o meu código para SQLite Cordova:
E o outro:
fonte
Eu pensei em colocar meus 2 centavos nessa discussão, mesmo que seja um pouco antigo. Essa consulta retorna o escalar 1 se a tabela existir e 0 caso contrário.
fonte
A tabela existe ou não no banco de dados no swift
fonte