වගුවක් තිබේද යන්න SQLite හි පරීක්ෂා කරන්නේ කෙසේද?


915

විශේෂිත පරිශීලක වගුවක් තිබේද යන්න මම විශ්වාසදායක ලෙස SQLite හි පරීක්ෂා කරන්නේ කෙසේද?

මේසය මත ඇති “තෝරන්න *” දෝෂයක් ලබා දුන්නේද නැද්ද යන්න පරීක්ෂා කිරීම වැනි විශ්වාසදායක ක්‍රම මම ඉල්ලන්නේ නැත (මෙය හොඳ අදහසක්ද?).

හේතුව මෙසේ ය:

මගේ වැඩසටහනේ, සමහර වගු දැනටමත් නොපවතී නම් ඒවා නිර්මාණය කර ජනගහනය කළ යුතුය.

ඒවා දැනටමත් තිබේ නම්, මට වගු කිහිපයක් යාවත්කාලීන කළ යුතුය.

සැක සහිත වගු දැනටමත් නිර්මාණය කර ඇති බවට සං signal ා කිරීම වෙනුවට මම වෙනත් මාර්ගයක් ගත යුතුද - නිදසුනක් ලෙස, මගේ වැඩසටහන් ආරම්භක / සැකසුම් ගොනුවේ තැටියේ හෝ වෙනත් යමක් තුළ යම් ධජයක් තැනීමෙන් / තැබීමෙන් / සැකසීමෙන් කියන්න?

නැත්නම් මගේ ප්‍රවේශය අර්ථවත්ද?


තෝරාගත් වගුව නොපවතී නම් SQLite ව්‍යතිරේකයක් දමනු ඇත. තවත් විසිතුරු වැඩක් අවශ්‍ය නොවේ.
NoChance

36
Oc එසේ නොකරන්න, නමුත් වෙනත් ඕනෑම දෙයක් එසේ වනු ඇත. ඔබේ ඇස් වසාගෙන ඉදිරියට ධාවනය කිරීමෙන් එම ගස සැබවින්ම තිබේදැයි බැලීමට එය ටිකක් සමාන ය, ඔබ එක් මාර්ගයක් හෝ වෙනත් මාර්ගයක් සොයා ගනු ඇත :)
randomsock

1
endrandomsock, හොඳ උදාහරණයක්, නමුත් ටිකක් බය හිතෙනවා, විශේෂයෙන්ම කාර් එක මගේ කාර් එක නම් ...
NoChance

ndrandomsock, sqlite සම්මුතිය යනු කුමක්දැයි මම නොදනිමි, නමුත් අවසරයට වඩා සමාව ඉල්ලා සිටීම පයිතොනික් ය. එනම් කොන්දේසියක් භාවිතා කිරීම වෙනුවට ව්‍යතිරේකය අල්ලා ගන්න.
එරික්

1
@ එරික් මේ වන විට, ප්‍රශ්නයට පයිතන් සම්බන්ධ නොවේ, නමුත් එය එසේ යැයි උපකල්පනය කළහොත්, දෝෂය සාමාන්‍යයකි sqlite3.OperationalError, එබැවින් එය තහවුරු කර ගැනීම සඳහා ඔබ දෝෂ පණිවිඩය විග්‍රහ කළ යුතුය. උදා: "වගුව TABLE_NAME දැනටමත් පවතී" පණිවිඩය ඔබ නිර්මාණය කරන විට වගුවක්, නැතිනම්, දෝෂය නැවත තක්සේරු කරන්න, දෝෂයේ වාක්‍ය ඛණ්ඩය වෙනස් නොවන බවට සහතිකයක් නැතැයි මම සිතමි.
මාකස් වොන් බ්‍රෝඩි

Answers:


1045

මට එම නිති අසන ප්‍රශ්න ඇතුළත් විය.

කෙසේ වෙතත්, අනාගත යොමු කිරීම සඳහා, සම්පූර්ණ විමසුම:

SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';

{table_name}පරීක්ෂා කිරීමට වගුවේ නම කොහිද?

යොමු කිරීම සඳහා ප්‍රලේඛන අංශය: දත්ත සමුදා ගොනු ආකෘතිය. 2.6. SQL දත්ත සමුදා යෝජනා ක්‍රමය ගබඩා කිරීම

  • මෙය නිශ්චිතව දක්වා ඇති නම සහිත වගු ලැයිස්තුවක් ලබා දෙනු ඇත; එනම්, කර්සරයට 0 (නොපවතී) හෝ 1 ගණනය කිරීමක් (පවතී)

7
මෙම පද්ධති වගු ආවරණය කරන SQLite ප්‍රලේඛනවලින් කවරේද?
පවෙල් වෙසෙලොව්

31
Aw පවෙල් වෙසෙලොව්: "SQLite දත්ත සමුදායන් සඳහා ගොනු ආකෘතිය" යන මාතෘකාව: sqlite.org/fileformat2.html
බ්‍රයන් ඕක්ලි

16
කෙසේ වෙතත් මෙය TEMP වගු සඳහා ක්‍රියා නොකරනු ඇත. TEMP වගු "sqlite_temp_master" හි ඇත.
PatchyFog

11
මෙය නැවත බූලියනයක් ලබා දෙයිද? වගුව පවතින්නේ හෝ නොපවතී නම් එය නැවත පැමිණෙන්නේ කුමක් ද?
Dagrooms

9
AgDagrooms මෙය නිශ්චිතව දක්වා ඇති නම සහිත වගු ලැයිස්තුවක් ලබා දෙනු ඇත; එනම්, කර්සරයට 0 (නොපවතී) හෝ 1 ගණනය කිරීමක් (පවතී) ඇත.
රයින් එස්

569

ඔබ SQLite අනුවාදය 3.3+ භාවිතා කරන්නේ නම් ඔබට පහසුවෙන් පහත වගුවක් සෑදිය හැකිය:

create table if not exists TableName (col1 typ1, ..., colN typN)

එලෙසම, ඔබට වගුවක් ඉවත් කළ හැක්කේ එය භාවිතා කිරීමෙන් පමණි:

drop table if exists TableName

3
create tableප්‍රකාශය අසම්පූර්ණ බව සලකන්න (වගු තීරු පිරිවිතර අස්ථානගත වී ඇත).
එරික් ප්ලේටන්

12
දර්ශක සඳහා සමාන ඉදිකිරීමක් ද ඇත: නොපවතී නම් දර්ශකය සාදන්න TableName (col1) හි
TableName_col1

26
මෙය පිළිගත් පිළිතුර නොවිය යුතුය, නමුත් ප්‍රශ්නය වෙනස් ආකාරයකින් වචන වලින් කියනු ලැබුවහොත්. හැලීමට හෝ නිර්මාණය කිරීමට පෙර වගුවක් පරීක්ෂා කරන්නේ කෙසේදැයි OP විමසුවේ නැත. නොපවතින වගුවක් විමසීමට ඔබට සිදුවුවහොත් කුමක් කළ යුතුද? මම දැන් මුහුණ දෙන ගැටලුව මෙය වන අතර පිළිගත් පිළිතුර මෙම පොදු ගැටළු ප්‍රකාශයේ වඩාත් හොඳින් ක්‍රියාත්මක වේ. මෙය හොඳ ඉක්මන් විකල්පයකි.
Dagrooms

Ag ඩැග්රූම්ස්, ඔබ නිවැරදියි. මෙම විශ්රාම වැටුප් මෙම ඉල්ලා නැති වුණත්, මම මේ පිළිතුර :) හෙව්වා
earik87

172

විචලනය වනුයේ SELECT NAME වෙනුවට SELECT COUNT (*) භාවිතා කිරීමයි

SELECT count(*) FROM sqlite_master WHERE type='table' AND name='table_name';

මෙය 0 නැවත ලබා දෙනු ඇත, වගුව නොපවතී නම්, 1 එය තිබේ නම්. සංඛ්‍යාත්මක ප්‍රති result ලයක් ඉක්මණින් / සැකසීමට පහසු බැවින් මෙය ඔබේ ක්‍රමලේඛනයේදී ප්‍රයෝජනවත් වේ. පහත දැක්වෙන්නේ ඔබ පරාමිති සහිත SQLiteDatabase, Cursor, rawQuery භාවිතා කරමින් ඇන්ඩ්‍රොයිඩ් තුළ මෙය කරන්නේ කෙසේද යන්නයි.

boolean tableExists(SQLiteDatabase db, String tableName)
{
    if (tableName == null || db == null || !db.isOpen())
    {
        return false;
    }
    Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM sqlite_master WHERE type = ? AND name = ?", new String[] {"table", tableName});
    if (!cursor.moveToFirst())
    {
        cursor.close();
        return false;
    }
    int count = cursor.getInt(0);
    cursor.close();
    return count > 0;
}

33
"SELECT 1" ඊටත් වඩා වේගවත් වනු ඇතැයි මම විශ්වාස කරමි.
PatchyFog

Cursor.getInt (0) දත්ත සමුදායේ වාර්තා ගණනය කිරීමට සමාන වන්නේ ඇයි?
සෙමියොන් ඩැනිලොව්

1
අපි ගණනය කරන්නේ වර්ගීකරණ යෝජනා ක්‍රමයේ TABLE දර්ශනය වන වාර ගණනයි. 0 ගණනය කිරීම යනු වගුව නොපවතී. 1 ගණනය කිරීම යනු වගුව පවතින බවයි. ගණන් කිරීමේ අපේක්ෂිත අගයන් දෙක මේවා වේ.
ස්ටීවන් ක්වාන්

1
අංකය (සිට COUNT(*)) සැකසීමට පහසු වුවත්, පේළියක පැවැත්ම නැවත ලබා දීම හෝ නොකිරීම පහසුය; එහි පේළියක් තිබේ නම් එය පවතී, පේළියක් නොමැති නම් එය නැත. (ඔබ දැනටමත් moveToFirst දී අපොහොසත් වීම සඳහා, වැඩ එම අවස්ථාවේ දී සිදු කළ බව එසේ පරීක්ෂා කරන්න.)
ඩෑෂ්-ටොම්-පිපුරුම්

ඔබ වැරදියට පැමිණීමට පෙර කර්සරය වසා දැමීමට කරුණාකර ඔබේ කේතය යාවත්කාලීන කරන්න.
ඩේව් තෝමස්

44

ඔබට උත්සාහ කළ හැකිය:

SELECT name FROM sqlite_master WHERE name='table_name'

4
type = table ප්‍රයෝජනවත් වනු ඇත
tho

C # භාවිතා කරන්නේ නම්, මෙම විධානය භාවිතා කර නැහැ SQLiteReader reader = cmd.ExecuteReader();සහ කරන්න dt.Load(reader)(එහිදී dtයනු DataTable). වගුව සොයාගත නොහැකි නම් එය මෙම Object reference is not an instance of an objectව්‍යතිරේකය ලබා දෙන .Load()බව මට පෙනී ගියේය. ඒ වෙනුවට, a භාවිතා කර SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd); කරන්න adapter.Fill(ds), කොහෙද dsa DataSet. නම්, ඔබ පසුව බලන්න පුළුවන් ds.Tables.Count > 0සහ return ds.Tables[0];එසේ (හෝ නම් else return null). එවිට ඔබට එය DataTableතිබේ nullනම් dt.Rows != null, තිබේ නම් සහ තිබේදැයි පරීක්ෂා කළ හැකියdt.Rows.Count>0
vapcguy

35

භාවිත:

PRAGMA table_info(your_table_name)

එහි ප්‍රති table ලයක් ලෙස ඇති වගුව හිස් නම් your_table_name නොපවතී.

ප්‍රලේඛනය:

PRAGMA schema.table_info (වගුවේ නම);

මෙම ප්‍රාග්මාව නම් කරන ලද වගුවේ එක් එක් තීරුව සඳහා එක් පේළියක් ලබා දෙයි. ප්‍රති result ල කට්ටලයේ තීරුවලට තීරුවේ නම, දත්ත වර්ගය, තීරුව NULL විය හැකිද නැද්ද යන්න සහ තීරුවේ පෙරනිමි අගය ඇතුළත් වේ. ප්‍රති key ල කට්ටලයේ "pk" තීරුව ප්‍රාථමික යතුරේ කොටසක් නොවන තීරු සඳහා ශුන්‍ය වන අතර එය ප්‍රාථමික යතුරේ කොටසක් වන තීරු සඳහා ප්‍රාථමික යතුරේ තීරුවේ දර්ශකය වේ.

Table_info pragma හි නම් කර ඇති වගුව ද දර්ශනයක් විය හැකිය.

උදාහරණ ප්‍රතිදානය:

cid|name|type|notnull|dflt_value|pk
0|id|INTEGER|0||1
1|json|JSON|0||0
2|name|TEXT|0||0

පයිතන් හි වගුවක් තිබේද යන්න තීරණය කිරීමට මෙය හොඳ ක්‍රමයකි.
මයිකල් මර්ෆි

හෝ Xamarin පෝරම
SerenityNow

4
ක්‍රමලේඛනගතව තීරු අර්ථ දැක්වීම් ලබා ගැනීමට මෙය හොඳ ක්‍රමයකි
w00t

34

ඔබට "වගුවක් දැනටමත් පවතී" දෝෂයක් ලැබෙන්නේ නම්, පහත පරිදි SQL නූලෙහි වෙනස්කම් කරන්න:

CREATE table IF NOT EXISTS table_name (para1,para2);

මේ ආකාරයෙන් ඔබට ව්‍යතිරේකයන් වළක්වා ගත හැකිය.



33

SQLite වගු නම් සිද්ධි සංවේදී නොවේ, නමුත් සංසන්දනය පෙරනිමියෙන් සිද්ධි සංවේදී වේ. සෑම අවස්ථාවකදීම මෙම කාර්යය නිසියාකාරව සිදු කිරීම සඳහා ඔබ එකතු කළ COLLATE NOCASEයුතුය.

SELECT name FROM sqlite_master WHERE type='table' AND name='table_name' COLLATE NOCASE

23

ඔබ fmdb භාවිතා කරන්නේ නම් , මම හිතන්නේ ඔබට FMDatabaseAdditions ආනයනය කර bool ශ්‍රිතය භාවිතා කළ හැකිය :

[yourfmdbDatabase tableExists:tableName].

1
මෙම ක්‍රමය භාවිතා කිරීම සඳහා ඔබ "FMDatabaseAdditions.h" ආනයනය කරන බවට වග බලා ගන්න, එසේ නොමැතිනම් ඔවුන් එය ඉවත් කළේ ඇයිදැයි ඔබ කල්පනා කරනු ඇත! :)
විල්

මෙය නිවැරදි පිළිතුරක් විය හැකි නමුත්, ප්‍රශ්නය වූයේ වර්ග භාෂාව නිශ්චිත භාෂාවක පුස්තකාලයක් නොවේ. මම හිතන්නේ පිළිතුර විය යුත්තේ
SQL

13

පහත කේතය වගුව තිබේ නම් 1 ක් හෝ වගුව නොපවතී නම් 0 ලබා දෙයි.

SELECT CASE WHEN tbl_name = "name" THEN 1 ELSE 0 END FROM sqlite_master WHERE tbl_name = "name" AND type = "table"

1
වගුව නොපවතී නම් මෙය තවමත් කිසිවක් ආපසු නොදෙනු ඇත, මන්දයත් තත්වය කිසියම් ප්‍රති .ලයක් වළක්වයි.
ඩේවිඩ් ගවුස්මන්

10

TEMP දත්ත ගබඩාවේ වගුවක් තිබේදැයි පරීක්ෂා කිරීමට, ඔබ sqlite_temp_masterඒ වෙනුවට භාවිතා කළ යුත්තේ sqlite_master:

SELECT name FROM sqlite_temp_master WHERE type='table' AND name='table_name';

9

මෙන්න මම භාවිතා කළ ශ්‍රිතය:

SQLDatabase Object = db ලබා දී ඇත

public boolean exists(String table) {
    try {
         db.query("SELECT * FROM " + table);
         return true;
    } catch (SQLException e) {
         return false;
    }
}

1
සැම්සුන් උපාංග අනෙක් සියල්ලන් සමඟ වැඩ කරන සම්මත sqlite_master වගු ව්‍යුහය භාවිතා නොකරන බව මට පෙනී ගිය හෙයින් මට මෙය මගේ ඇන්ඩ්‍රොයිඩ් යෙදුමේ භාවිතා කිරීමට සිදුවිය.
ඇන්තනි චුවිනාර්ඩ්

7

මෙම කේතය භාවිතා කරන්න:

SELECT name FROM sqlite_master WHERE type='table' AND name='yourTableName';

ආපසු ලබා දුන් අරා ගණන 1 ට සමාන නම් එයින් අදහස් වන්නේ වගුව පවතින බවයි. එසේ නොමැති නම් එය නොපවතී.


5
class CPhoenixDatabase():
    def __init__(self, dbname):
        self.dbname = dbname
        self.conn = sqlite3.connect(dbname)

    def is_table(self, table_name):
        """ This method seems to be working now"""
        query = "SELECT name from sqlite_master WHERE type='table' AND name='{" + table_name + "}';"
        cursor = self.conn.execute(query)
        result = cursor.fetchone()
        if result == None:
            return False
        else:
            return True

සටහන: මෙය දැන් මගේ මැක්හි පයිතන් 3.7.1 සමඟ ක්‍රියා කරයි


මෙය අනෙක් සියලුම පිළිතුරු වලට වඩා පිරිසිදු බව පෙනේ .. ස්තූතියි !!
හර්ෂ වර්ධන්

මට වැඩ කරන්නේ නැත: table_name වටා {} වරහන් මකා දැමිය යුතුය, පසුව එහි දඩය.
කෙසෙල්

1
table_nameභාවිතයට නොගත් ප්‍රභවයකින් (පරිශීලක ආදානය වැනි) ලබා දී නොමැති බවට වග බලා ගන්න , එසේ නොමැති නම් එය SQL එන්නත් කිරීමට ගොදුරු වේ. පෙළ හැසිරවීමේ ක්‍රම වෙනුවට පරාමිතීන් භාවිතා කිරීම වඩා හොඳය
astef

3

භාවිත

SELECT 1 FROM table LIMIT 1;

සියලුම වාර්තා කියවීම වැළැක්වීමට.


වගුව පවතින නමුත් කිසිදු වාර්තාවක් නොමැති නම් මෙය NULL නැවත ලබා දෙයි.
රේඩියෝස්පීල්

වගුව නොපවතී නම්, එය දෝෂයක් ඇති කරයි. එය අල්ලා ගන්න, එය නොපවතින බව ඔබ දන්නවා.
වාසනාවන්ත

ප්‍රවාහ පාලනය ලෙස දෝෂ හැසිරවීම සාමාන්‍යයෙන් හොඳම පුහුණුව ලෙස නොසැලකේ. මෙය බොහෝ විට වළක්වා ගත යුතුය.
ජෙෆ් වුඩාර්ඩ්

3

වගුවේ පැවැත්ම පරීක්ෂා කිරීම සඳහා ඔබට පහත විමසුම ලිවිය හැකිය.

SELECT name FROM sqlite_master WHERE name='table_name'

මෙන්න 'table_name' යනු ඔබ විසින් සාදන ලද ඔබේ වගුවේ නමයි. උදාහරණයක් වශයෙන්

 CREATE TABLE IF NOT EXISTS country(country_id INTEGER PRIMARY KEY AUTOINCREMENT, country_code TEXT, country_name TEXT)"

පරීක්ෂා කරන්න

  SELECT name FROM sqlite_master WHERE name='country'

7
මීට වසර 9 කට පෙර දැනටමත් පිළිගත් ඉහළ පෙළේ පිළිතුරට වඩා මෙය වෙනස් වන්නේ කෙසේද?
කෙවින් වැන් ඩික්

3

SQLite 3 භාවිතා කරන නවතම sqlite-net-pcl nuget පැකේජය (1.5.231) භාවිතා කරමින් C # හි මා දැන් සොයාගෙන ඇති වඩාත්ම විශ්වාසදායක ක්‍රමය පහත පරිදි වේ:

var result = database.GetTableInfo(tableName);
if ((result == null) || (result.Count == 0))
{
    database.CreateTable<T>(CreateFlags.AllImplicit);
}

2

සරල තේරීම් විමසුමක් භාවිතා කිරීම - මගේ මතය අනුව - තරමක් විශ්වාසදායකය. බොහෝ විට එයට විවිධ දත්ත සමුදා වර්ගවල (SQLite / MySQL) වගු පැවැත්ම පරීක්ෂා කළ හැකිය.

SELECT 1 FROM table;

විමසුම සාර්ථක වූවාද යන්න තීරණය කිරීම සඳහා ඔබට වෙනත් විශ්වාසදායක යාන්ත්‍රණයක් භාවිතා කළ හැකි විට එය අර්ථවත් කරයි (නිදසුනක් ලෙස, ඔබ Qt හි QSqlQuery හරහා දත්ත සමුදායක් විමසයි ).


1

c ++ ශ්‍රිතය db සහ වගුවේ සහ (විකල්ප වශයෙන්) තීරුවේ පැවැත්ම සඳහා අමුණා ඇති සියලුම දත්ත සමුදායන් පරීක්ෂා කරයි.

bool exists(sqlite3 *db, string tbl, string col="1")
{
    sqlite3_stmt *stmt;
    bool b = sqlite3_prepare_v2(db, ("select "+col+" from "+tbl).c_str(),
    -1, &stmt, 0) == SQLITE_OK;
    sqlite3_finalize(stmt);
    return b;
}

සංස්කරණය කරන්න: මෑතකදී sqlite3_table_column_metadata ශ්‍රිතය සොයා ගන්නා ලදි. එබැවින්

bool exists(sqlite3* db,const char *tbl,const char *col=0)
{return sqlite3_table_column_metadata(db,0,tbl,col,0,0,0,0,0)==SQLITE_OK;}

පොදු ස්ථිතික බූලියන් වගු එක්සිස්ට් (SQLiteDatabase දත්ත සමුදාය, සංගීත වගුවේ නම) {ආපසු දත්ත සමුදාය. }
නික්

නූල් සම්මුතියක් ලෙස ඉතා අකාර්යක්ෂම හා අවදානම් සහගත ක්‍රමයක් සෑම දෙයකටම අවසන් විය හැකිය.
ඇන්ඩ්‍රියා මොරෝ

0

SQLite Cordova සඳහා මෙය මගේ කේතයයි:

get_columnNames('LastUpdate', function (data) {
    if (data.length > 0) { // In data you also have columnNames
        console.log("Table full");
    }
    else {
        console.log("Table empty");
    }
});

අනෙක:

function get_columnNames(tableName, callback) {
    myDb.transaction(function (transaction) {
        var query_exec = "SELECT name, sql FROM sqlite_master WHERE type='table' AND name ='" + tableName + "'";
        transaction.executeSql(query_exec, [], function (tx, results) {
            var columnNames = [];
            var len = results.rows.length;
            if (len>0){
                var columnParts = results.rows.item(0).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').split(','); ///// RegEx
                for (i in columnParts) {
                    if (typeof columnParts[i] === 'string')
                        columnNames.push(columnParts[i].split(" ")[0]);
                };
                callback(columnNames);
            }
            else callback(columnNames);
        });
    });
}

0

මම හිතුවා මගේ ශත 2 මේ සාකච්ඡාවට දමන්න, එය තරමක් පැරණි එකක් වුවත් .. මෙම විමසුම වගුව තිබේ නම් පරිමාණය 1 සහ වෙනත් ආකාරයකින් 0 ලබා දෙයි.

select 
    case when exists 
        (select 1 from sqlite_master WHERE type='table' and name = 'your_table') 
        then 1 
        else 0 
    end as TableExists

0

වගුව පවතින්නේ හෝ වේගයෙන් දත්ත සමුදායේ නැත

func tableExists(_ tableName:String) -> Bool {
        sqlStatement = "SELECT name FROM sqlite_master WHERE type='table' AND name='\(tableName)'"
        if sqlite3_prepare_v2(database, sqlStatement,-1, &compiledStatement, nil) == SQLITE_OK {
            if sqlite3_step(compiledStatement) == SQLITE_ROW {
                return true
            }
            else {
                return false
            }
        }
        else {
            return false
        }
            sqlite3_finalize(compiledStatement)
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.