Bagaimana saya, andal , memeriksa dalam SQLite, apakah ada tabel pengguna tertentu?
Saya tidak meminta cara yang tidak dapat diandalkan seperti memeriksa apakah "pilih *" di atas meja mengembalikan kesalahan atau tidak (apakah ini ide yang bagus?).
Alasannya seperti ini:
Dalam program saya, saya perlu membuat dan mengisi beberapa tabel jika belum ada.
Jika sudah ada, saya perlu memperbarui beberapa tabel.
Haruskah saya mengambil jalan lain sebagai gantinya untuk memberi tanda bahwa tabel yang dimaksud telah dibuat - katakan misalnya, dengan membuat / meletakkan / mengatur bendera tertentu dalam file inisialisasi / pengaturan program saya pada disk atau sesuatu?
Atau apakah pendekatan saya masuk akal?
sqlite3.OperationalError
, jadi Anda harus menguraikan pesan kesalahan untuk memastikan itu misalnya pesan "tabel TABLE_NAME sudah ada" saat Anda membuat sebuah tabel, dan jika tidak, reraise kesalahan dan saya pikir tidak ada jaminan frase kesalahan tidak akan berubah.Jawaban:
Saya melewatkan entri FAQ itu.
Lagi pula, untuk referensi di masa mendatang, kueri lengkapnya adalah:
Di mana
{table_name}
nama tabel untuk diperiksa.Bagian dokumentasi untuk referensi: Format File Database. 2.6. Penyimpanan Skema Database SQL
sumber
Jika Anda menggunakan SQLite versi 3.3+ Anda dapat dengan mudah membuat tabel dengan:
Dengan cara yang sama, Anda bisa menghapus tabel hanya jika ada dengan menggunakan:
sumber
create table
pernyataan tidak lengkap (tidak ada spesifikasi kolom tabel).Variasi akan menggunakan SELECT COUNT (*) daripada SELECT NAME, yaitu
Ini akan mengembalikan 0, jika tabel tidak ada, 1 jika ada. Ini mungkin berguna dalam pemrograman Anda karena hasil numerik lebih cepat / mudah untuk diproses. Berikut ini menggambarkan bagaimana Anda akan melakukan ini di Android menggunakan SQLiteDatabase, Cursor, rawQuery dengan parameter.
sumber
COUNT(*)
) mudah diproses, lebih mudah untuk mengembalikan keberadaan baris atau tidak; jika ada baris di sana maka itu ada, jika tidak ada baris itu tidak ada. (Anda sudah memeriksa kegagalan dalam moveToFirst, sehingga pekerjaan akan dilakukan pada saat itu.)Kamu bisa mencoba:
sumber
SQLiteReader reader = cmd.ExecuteReader();
dan lakukan adt.Load(reader)
(di manadt
aDataTable
). Saya menemukan ini memberikanObject reference is not an instance of an object
pengecualian ini.Load()
jika tabel tidak ditemukan. Sebaliknya, gunakan aSQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
dan lakukanadapter.Fill(ds)
, di manads
aDataSet
. Anda kemudian dapat melihat apakahds.Tables.Count > 0
danreturn ds.Tables[0];
jika demikian (atauelse return null
). Kemudian Anda dapat memeriksa bahwaDataTable
untuk menjadinull
, jikadt.Rows != null
, dan jikadt.Rows.Count>0
Menggunakan:
Jika tabel yang dihasilkan kosong maka
your_table_name
tidak ada.Dokumentasi:
Contoh output:
sumber
Nama tabel SQLite peka huruf besar kecil, tetapi perbandingan huruf besar-kecil secara default. Agar ini berfungsi dengan baik dalam semua kasus, Anda perlu menambahkan
COLLATE NOCASE
.sumber
Jika Anda mendapatkan kesalahan "tabel sudah ada", buat perubahan pada string SQL seperti di bawah ini:
Dengan cara ini Anda dapat menghindari pengecualian.
sumber
Lihat ini :
sumber
Jika Anda menggunakan fmdb , saya pikir Anda bisa mengimpor FMDatabaseAdditions dan menggunakan fungsi bool:
sumber
Kode berikut mengembalikan 1 jika tabel ada atau 0 jika tabel tidak ada.
sumber
Perhatikan bahwa untuk memeriksa apakah suatu tabel ada dalam basis data TEMP, Anda harus menggunakan
sqlite_temp_master
alih-alihsqlite_master
:sumber
Inilah fungsi yang saya gunakan:
Diberikan Objek SQLDatabase = db
sumber
Gunakan kode ini:
Jika jumlah array yang dikembalikan sama dengan 1 artinya tabel ada. Kalau tidak, itu tidak ada.
sumber
Catatan: Ini berfungsi sekarang di Mac saya dengan Python 3.7.1
sumber
table_name
tidak disediakan dari sumber yang tidak dijelajahi (seperti input pengguna), jika tidak maka akan rentan terhadap injeksi SQL. Itu selalu lebih baik menggunakan parameter daripada teknik manipulasi teksMenggunakan
untuk mencegah semua catatan dibaca.
sumber
Anda bisa menulis kueri berikut untuk memeriksa keberadaan tabel.
Di sini 'table_name' adalah nama tabel Anda apa yang Anda buat. Sebagai contoh
dan cek
sumber
Cara paling dapat diandalkan yang saya temukan di C # sekarang, menggunakan paket nuget sqlite-net-pcl terbaru (1.5.231) yang menggunakan SQLite 3, adalah sebagai berikut:
sumber
Menggunakan kueri SELECT sederhana - menurut saya - cukup dapat diandalkan. Sebagian besar dari semua itu dapat memeriksa keberadaan tabel di berbagai jenis database (SQLite / MySQL).
Masuk akal ketika Anda dapat menggunakan mekanisme andal lainnya untuk menentukan apakah kueri berhasil (misalnya, Anda meminta basis data melalui QSqlQuery di Qt ).
sumber
fungsi c ++ memeriksa db dan semua database terlampir untuk keberadaan tabel dan kolom (opsional).
Sunting: Baru-baru ini menemukan fungsi sqlite3_table_column_metadata. Karenanya
sumber
Ini adalah kode saya untuk SQLite Cordova:
Dan yang lainnya:
sumber
Saya pikir saya akan menempatkan 2 sen saya untuk diskusi ini, bahkan jika itu agak lama .. Kueri ini mengembalikan skalar 1 jika tabel ada dan 0 sebaliknya.
sumber
Tabel ada atau tidak dalam database dengan cepat
sumber