টেবিলটি এসকিউএলাইটে উপস্থিত না থাকলে কলাম যুক্ত করুন


92

সম্প্রতি আমাদের বিদ্যমান কয়েকটি এসকিউএল ডাটাবেস টেবিলগুলিতে কলাম যুক্ত করার দরকার পড়েছিল। এটি দিয়ে করা যেতে পারে ALTER TABLE ADD COLUMN। অবশ্যই, যদি টেবিলটি ইতিমধ্যে পরিবর্তন করা হয়েছে তবে আমরা এটিকে একা রেখে যেতে চাই। দুর্ভাগ্যক্রমে, এসকিউএলাইট কোনও IF NOT EXISTSধারা সমর্থন করে না ALTER TABLE

আমাদের বর্তমান কাজটি হল অল্টার টেবিল স্টেটমেন্টটি কার্যকর করা এবং যেকোন "ডুপ্লিকেট কলাম নাম" ত্রুটি উপেক্ষা করা, ঠিক এই পাইথন উদাহরণের মতো (তবে সি ++ তে)।

যাইহোক, ডাটাবেস স্কিমার সেট আপ করার জন্য আমাদের স্বাভাবিক পদ্ধতির একটি .sql স্ক্রিপ্ট থাকা CREATE TABLE IF NOT EXISTSএবং CREATE INDEX IF NOT EXISTSবিবৃতি থাকতে হবে, যা কমান্ড-লাইন সরঞ্জাম ব্যবহার করে কার্যকর করা sqlite3_execযায় sqlite3। আমরা ALTER TABLEএই স্ক্রিপ্ট ফাইলগুলিতে রাখতে পারি না কারণ যদি বিবৃতিটি ব্যর্থ হয় তবে এর পরে যে কোনও কিছুই কার্যকর করা হবে না।

আমি টেবিলের সংজ্ঞাগুলি এক জায়গায় রাখতে চাই এবং .sql এবং .cpp ফাইলগুলির মধ্যে বিভক্ত না হয়ে চাই। ALTER TABLE ADD COLUMN IF NOT EXISTSখাঁটি এসকিউএল এসকিউএল তে কাজ করার উপায় আছে কি ?

উত্তর:


65

আমার কাছে 99% খাঁটি এসকিউএল পদ্ধতি রয়েছে। ধারণাটি হ'ল আপনার স্কিমা সংস্করণ করা। আপনি এটি দুটি উপায়ে করতে পারেন:

  • PRAGMA user_versionআপনার ডাটাবেস স্কিমা সংস্করণের জন্য একটি বর্ধিত সংখ্যা সঞ্চয় করতে 'ব্যবহারকারীর_ব্যক্তি' প্রগমা কমান্ড ( ) ব্যবহার করুন।

  • আপনার নিজস্ব সংজ্ঞায়িত টেবিলটিতে আপনার সংস্করণ নম্বর সংরক্ষণ করুন।

এইভাবে, যখন সফ্টওয়্যারটি শুরু হয়, এটি ডাটাবেস স্কিমাটি পরীক্ষা করতে পারে এবং যদি প্রয়োজন হয় ALTER TABLEতবে আপনার ক্যোয়ারী চালাতে পারে , তারপরে সঞ্চিত সংস্করণটিকে বাড়িয়ে তুলবে। এটি বিভিন্ন আপডেট "অন্ধ" চেষ্টা করার চেয়ে অনেক বেশি ভাল, বিশেষত যদি বছরের পর বছরগুলিতে আপনার ডাটাবেস কয়েকগুণ বেড়ে যায় এবং পরিবর্তিত হয়।


7
এর প্রাথমিক মান কী user_version? আমি শূন্য অনুমান করি, তবে সেই নথিটি দেখতে ভাল লাগবে be
ক্রেগ ম্যাককুইন

এমনকি এটি দিয়ে, এটি কি খাঁটি এসকিউএলে করা যায়, যেহেতু স্ক্লাইটটি সমর্থন করে না IFএবং এর ALTER TABLEশর্তসাপেক্ষ নেই? "99% খাঁটি এসকিউএল" বলতে কী বোঝ?
ক্রেগ ম্যাককুইন

4
@ ক্রেইগম্যাক কিউইন এর প্রাথমিক মান হিসাবে user_versionএটি 0 বলে মনে হচ্ছে তবে এটি সত্যই ব্যবহারকারী-সংজ্ঞায়িত মান, যাতে আপনি নিজের প্রাথমিক মানটি তৈরি করতে পারেন।
এমপিলেটিয়ার

7
user_versionপ্রাথমিক মান সম্পর্কে প্রশ্নটি প্রাসঙ্গিক যখন আপনি একটি বিদ্যমান ডাটাবেস পেয়েছেন, এবং আপনি এর user_versionআগে কখনও ব্যবহার করেননি তবে আপনি এটি ব্যবহার শুরু করতে চান, সুতরাং আপনাকে স্কাইক্লাইটটি একটি নির্দিষ্ট প্রাথমিক মান হিসাবে সেট করা অনুমান করা উচিত।
ক্রেগ ম্যাককুইন

4
পছন্দ করুন
এমপিলেটিয়ার

31

একটি কাজ হ'ল কেবল কলাম তৈরি করা এবং কলামটি ইতিমধ্যে উপস্থিত থাকলে যে ব্যতিক্রম / ত্রুটি দেখা দেয় তা ধরা। একাধিক কলাম যুক্ত করার সময় এগুলিকে আলাদা ALTER TABLE বিবৃতিতে যুক্ত করুন যাতে একটি সদৃশ অন্যটিকে তৈরি হতে বাধা দেয় না।

স্ক্লাইট-নেট দিয়ে আমরা এরকম কিছু করেছি। এটি নিখুঁত নয়, যেহেতু আমরা অন্যান্য স্ক্লাইটের ত্রুটি থেকে নকল স্ক্লাইটের ত্রুটিগুলি আলাদা করতে পারি না।

Dictionary<string, string> columnNameToAddColumnSql = new Dictionary<string, string>
{
    {
        "Column1",
        "ALTER TABLE MyTable ADD COLUMN Column1 INTEGER"
    },
    {
        "Column2",
        "ALTER TABLE MyTable ADD COLUMN Column2 TEXT"
    }
};

foreach (var pair in columnNameToAddColumnSql)
{
    string columnName = pair.Key;
    string sql = pair.Value;

    try
    {
        this.DB.ExecuteNonQuery(sql);
    }
    catch (System.Data.SQLite.SQLiteException e)
    {
        _log.Warn(e, string.Format("Failed to create column [{0}]. Most likely it already exists, which is fine.", columnName));
    }
}

27

এসকিউএলাইট "টেবিল_ইনফো" নামে একটি প্রগমা বিবৃতি সমর্থন করে যা কলামের নাম (এবং কলাম সম্পর্কিত অন্যান্য তথ্য) সহ একটি সারণীতে প্রতি কলামে এক সারি প্রদান করে। অনুপস্থিত কলামটি পরীক্ষা করতে আপনি কোনও প্রশ্নের জন্য এটি ব্যবহার করতে পারেন, এবং উপস্থিত না থাকলে টেবিলটি পরিবর্তন করুন।

PRAGMA table_info(foo_table_name)

http://www.sqlite.org/pragma.html#pragma_table_info


32
আপনার উত্তরটি আরও দুর্দান্ত হবে যদি আপনি কেবল একটি লিঙ্কের পরিবর্তে সেই অনুসন্ধানটি সম্পন্ন করতে কোডটি সরবরাহ করেন।
মাইকেল অ্যালান হাফ

PRAGMA টেবিল_ইনফো (টেবিলের নাম)। এই কমান্ড ফলাফলের সারি হিসাবে টেবিল_নামের প্রতিটি কলাম তালিকাভুক্ত করবে। এই ফলাফলের ভিত্তিতে, আপনি নির্ধারণ করতে পারবেন কলামটি বিদ্যমান ছিল কি না।
হাও

4
বৃহত্তর এসকিউএল স্টেটমেন্টের অংশে প্রাগমা একত্রিত করে এটি করার কোনও উপায় আছে কি না যে কলামটি যদি এটি উপস্থিত না থাকে তবে যোগ করা হয় তবে অন্যথায় না হয়, কেবল একটি একক অনুসন্ধানে?
মাইকেল 20 'এ

4
@ মিশেল আমি যতদূর জানি, আপনি পারবেন না। PRAGMA কমান্ডের সমস্যা হ'ল আপনি এটিতে কোন প্রশ্ন করতে পারবেন না। কমান্ডটি এসকিউএল ইঞ্জিনে ডেটা উপস্থাপন করে না, এটি সরাসরি ফলাফল প্রদান করে
Kowlown

4
এটি কি কোনও রেসের শর্ত তৈরি করে না? বলুন আমি কলামের নামগুলি যাচাই করে দেখছি যে আমার কলামটি অনুপস্থিত রয়েছে তবে এর মধ্যে অন্য একটি প্রক্রিয়া কলামটি যুক্ত করে। তারপরে আমি কলামটি যুক্ত করার চেষ্টা করব তবে একটি ত্রুটি পাব কারণ এটি ইতিমধ্যে বিদ্যমান। আমার ধারণা আমি প্রথমে ডাটাবেস লক করব নাকি কিছু? আমি স্ক্লিট করতে একটি নুবু আমি ভয় করি :)।
বেন Farmer

26

আপনি যদি কোনও ডিবি আপগ্রেড স্টেটমেন্টে এটি করছেন, সম্ভবত সবচেয়ে সহজ উপায় হ'ল যদি আপনি ইতিমধ্যে বিদ্যমান ক্ষেত্রটি যুক্ত করার চেষ্টা করছেন তবে ফেলে দেওয়া ব্যতিক্রমটি ধরা।

try {
   db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN foo TEXT default null");
} catch (SQLiteException ex) {
   Log.w(TAG, "Altering " + TABLE_NAME + ": " + ex.getMessage());
}

4
আমি ব্যতিক্রম শৈলীর প্রোগ্রামিং পছন্দ করি না তবে এটি আশ্চর্যরকম পরিষ্কার। আপনি আমাকে কিছুটা ছড়িয়ে দিয়েছেন।
স্টিফেন জে

আমি এটি পছন্দও করি না, তবে সি ++ হ'ল সর্বকালের ব্যতিক্রমী স্টাইলের প্রোগ্রামিং ভাষা language সুতরাং আমি অনুমান করি যে কেউ এখনও এটিকে "বৈধ" হিসাবে দেখতে পাবে।
tmight

এসকিউএলাইটের জন্য আমার ব্যবহারের কেস = অন্য ভাষার (এমএসএসকিউএল) বোকা সরল / এক লাইনারের জন্য আমি আরও এক টন অতিরিক্ত কোডিং করতে চাই না। ভাল উত্তর ... এটি "ব্যতিক্রমী স্টাইল প্রোগ্রামিং" হলেও এটি একটি আপগ্রেড ফাংশনে / বিচ্ছিন্ন তাই আমি মনে করি এটি গ্রহণযোগ্য।
ম্যাপলেমল

অন্যেরা এটি পছন্দ না করলেও, আমি মনে করি এটি সবচেয়ে ভাল সমাধান
হ'ল

13

থ্রাই হ'ল PRAGMA এর একটি পদ্ধতি হ'ল টেবিল_ইনফো (টেবিলের নাম), এটি সারণীর সমস্ত তথ্য প্রদান করে।

এখানে চেক কলামটি কীভাবে বিদ্যমান তা না ব্যবহার করার জন্য এটি প্রয়োগ করা হচ্ছে,

    public boolean isColumnExists (String table, String column) {
         boolean isExists = false
         Cursor cursor;
         try {           
            cursor = db.rawQuery("PRAGMA table_info("+ table +")", null);
            if (cursor != null) {
                while (cursor.moveToNext()) {
                    String name = cursor.getString(cursor.getColumnIndex("name"));
                    if (column.equalsIgnoreCase(name)) {
                        isExists = true;
                        break;
                    }
                }
            }

         } finally {
            if (cursor != null && !cursor.isClose()) 
               cursor.close();
         }
         return isExists;
    }

আপনি লুপ ব্যবহার না করেও এই ক্যোয়ারীটি ব্যবহার করতে পারেন,

cursor = db.rawQuery("PRAGMA table_info("+ table +") where name = " + column, null);

কার্সার কার্সার = db.rawQuery ("টেবিল নাম থেকে * নির্বাচন করুন", নাল); কলামগুলি = কার্সার.জেটকলামনাম ();
ওয়াহে গারিবিয়ান

4
আমার ধারণা আপনি কার্সারটি বন্ধ করতে ভুলে গেছেন :-)
পেকানা

@ ভেহেঘড়িবিয়ান, সুতরাং আপনি কেবল কলামের নাম পেতে কেবল আপনার ডিবিতে সমস্ত কিছু নির্বাচন করবেন ?! আপনি যা বলছেন তা হ'ল we give no shit about performance:))।
ফরিদ

দ্রষ্টব্য, শেষ কোয়েরিটি ভুল। যথাযথ ক্যোয়ারীটি হ'ল: SELECT * FROM pragma_table_info(...)(নির্বাচন করুন এবং প্রগমা এবং টেবিলের তথ্যের মধ্যে আন্ডারস্কোরটি নোট করুন)। তারা আসলে এটি কী সংস্করণে যুক্ত করেছে তা নিশ্চিত নয়, এটি 3.16.0 এ কাজ করে নি তবে এটি 3.22.0 এ কাজ করে।
ওলআলওয়েজ

3

যারা আরও pragma table_info()বড় এসকিউএল এর অংশ হিসাবে এর ফলাফল ব্যবহার করতে চান ।

select count(*) from
pragma_table_info('<table_name>')
where name='<column_name>';

মূল অংশটি pragma_table_info('<table_name>')পরিবর্তে ব্যবহার করা pragma table_info('<table_name>')


এই উত্তরটি @ রবার্ট হকির প্রতিক্রিয়া দ্বারা অনুপ্রাণিত। আমি এটিকে নতুন উত্তর হিসাবে পোস্ট করার কারণ হ'ল মন্তব্য হিসাবে পোস্ট করার মতো যথেষ্ট খ্যাতি আমার নেই।


1

আমি এই প্রশ্নের সাথে হাজির

SELECT CASE (SELECT count(*) FROM pragma_table_info(''product'') c WHERE c.name = ''purchaseCopy'') WHEN 0 THEN ALTER TABLE product ADD purchaseCopy BLOB END
  • অভ্যন্তরীণ কোয়েরি 0 বা 1 ফিরে আসবে যদি কলাম বিদ্যমান থাকে।
  • ফলাফলের ভিত্তিতে, কলামটি পরিবর্তন করুন

কোড = ত্রুটি (1), বার্তা = System.Data.SQLite.SQLiteException (0x800007BF): "ALTER" এর কাছে এসকিউএল লজিক ত্রুটি: System.Data.SQLite.SQLite3.Prepare
イ コ コ グ ニ ト ア レ セ イ イ

স্ট্রিং (পণ্য এবং শপিংকপি) এর চারপাশে দুটি সাধারণ উদ্ধৃতি সহ আপনার টাইপোর ত্রুটি রয়েছে তবে "THEN ALTER TABLE" এর কারণে আমি এটিকে কাজ করতে পারি না। আপনি কি নিশ্চিত যে এটি সম্ভব? এটি যদি কাজ করে তবে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
নেকোবাস

0

আপনি যদি নমনীয়তা / অ্যাডোব বায়ুতে এই সমস্যাটি নিয়ে থাকেন এবং নিজেকে এখানে প্রথমে সন্ধান করেন তবে আমি একটি সমাধান পেয়েছি এবং এটি একটি সম্পর্কিত প্রশ্নে পোস্ট করেছি: স্ক্লাইট ডিবি না থাকলে কলম্ব যোগ করুন - ফ্লেক্স / এয়ার স্ক্লাইট?

আমার মন্তব্য এখানে: https://stackoverflow.com/a/24928437/2678219


0

আমি উপরের উত্তরটি সি # /। নেট-তে নিয়েছি এবং এটি কিউটি / সি ++ এর জন্য পুনরায় লিখেছিলাম, খুব বেশি পরিবর্তন হয়নি, তবে আমি ভবিষ্যতে যে কোনও সি ++ 'ইশ' এর উত্তর খুঁজতে চাইলে এটি এখানে রেখে দিতে চেয়েছিলাম।

    bool MainWindow::isColumnExisting(QString &table, QString &columnName){

    QSqlQuery q;

    try {
        if(q.exec("PRAGMA table_info("+ table +")"))
            while (q.next()) {
                QString name = q.value("name").toString();     
                if (columnName.toLower() == name.toLower())
                    return true;
            }

    } catch(exception){
        return false;
    }
    return false;
}

0

আপনি কলামটি বিদ্যমান কিনা তা জানতে pragma_table_info এর সংমিশ্রণে CASE-WHEN TSQL বিবৃতিটি ব্যবহার করতে পারেন:

select case(CNT) 
    WHEN 0 then printf('not found')
    WHEN 1 then printf('found')
    END
FROM (SELECT COUNT(*) AS CNT FROM pragma_table_info('myTableName') WHERE name='columnToCheck') 

এখানে আমরা টেবিল কীভাবে পরিবর্তন করব? কলামের নাম মিলবে কবে?
ব্যবহারকারী 2700767

0

এখানে আমার সমাধানটি দেওয়া হয়েছে তবে অজগরটিতে (অজগর সম্পর্কিত বিষয়ে আমি কোনও পোস্ট খুঁজে পেতে ব্যর্থ হয়েছি):

# modify table for legacy version which did not have leave type and leave time columns of rings3 table.
sql = 'PRAGMA table_info(rings3)' # get table info. returns an array of columns.
result = inquire (sql) # call homemade function to execute the inquiry
if len(result)<= 6: # if there are not enough columns add the leave type and leave time columns
    sql = 'ALTER table rings3 ADD COLUMN leave_type varchar'
    commit(sql) # call homemade function to execute sql
    sql = 'ALTER table rings3 ADD COLUMN leave_time varchar'
    commit(sql)

আমি টেবিলের তথ্য পেতে PRAGMA ব্যবহার করেছি। এটি কলাম সম্পর্কে তথ্যে পূর্ণ একটি বহুমাত্রিক অ্যারে প্রদান করে - প্রতি কলামে একটি অ্যারে। আমি কলামগুলির সংখ্যা পেতে অ্যারের সংখ্যা গণনা করি। যদি পর্যাপ্ত কলাম না থাকে তবে আমি ALTER TABLE কমান্ডটি ব্যবহার করে কলামগুলি যুক্ত করব।


0

আপনি যদি একবারে একটি লাইন প্রয়োগ করেন তবে এই সমস্ত উত্তর ঠিক আছে। তবে, আসল প্রশ্নটি ছিল এমন একটি স্কিল স্ক্রিপ্ট ইনপুট করা যা একক ডিবি এক্সিকিউট দ্বারা চালিত হবে এবং সমস্ত সমাধান (যেমন কলামটি আগে সময় আছে কিনা তা পরীক্ষা করে দেখার জন্য) এক্সিকিউটিভ প্রোগ্রামের প্রয়োজন হয় কোন টেবিলগুলির জ্ঞান থাকতে হবে এবং কলামগুলি পরিবর্তন / যুক্ত করা হচ্ছে বা এই তথ্য নির্ধারণের জন্য ইনপুট স্ক্রিপ্টের প্রাক-প্রসেসিং এবং পার্সিং করা হচ্ছে। সাধারণত আপনি রিয়েলটাইম বা প্রায়শই এটি চালাবেন না। সুতরাং একটি ব্যতিক্রম ধরা ধারণাটি গ্রহণযোগ্য এবং তারপরে এগিয়ে চলেছে। এর মধ্যে সমস্যা রয়েছে ... কীভাবে এগিয়ে যেতে হবে। ভাগ্যক্রমে ত্রুটি বার্তা আমাদের এটি করার জন্য প্রয়োজনীয় সমস্ত তথ্য দেয়। ধারণাটিটি হয় যে এসকিএলটি কার্যকর করতে যদি এটি কোনও পরিবর্তিত টেবিল কল ব্যাতিক্রম করে আমরা এসকিউএল-তে পরিবর্তিত টেবিল লাইনটি খুঁজে পেতে পারি এবং বাকী রেখাগুলি ফিরিয়ে আনতে পারি এবং এটি সফল না হওয়া অবধি কার্যকর করা হয় না বা পরিবর্তিত টেবিল লাইন খুঁজে পাওয়া যায় না। এখানে কিছু উদাহরণ কোড রয়েছে যেখানে আমাদের কাছে অ্যারেতে স্ক্রিপ্ট স্ক্রিপ্ট রয়েছে। আমরা প্রতিটি স্ক্রিপ্ট এক্সিকিউটিং অ্যারে পুনরাবৃত্তি। অলটার টেবিল কমান্ড ব্যর্থ হওয়ার জন্য আমরা এটি দু'বার কল করি তবে প্রোগ্রামটি সফল হয় কারণ আমরা এসকিএল থেকে অল্টার টেবিল কমান্ডটি সরিয়ে দিয়ে আপডেট কোডটি আবার প্রয়োগ করি।

#!/bin/sh
# the next line restarts using wish \

exec /opt/usr8.6.3/bin/tclsh8.6  "$0" ${1+"$@"}
foreach pkg {sqlite3 } {
    if { [ catch {package require {*}$pkg } err ] != 0 } {
    puts stderr "Unable to find package $pkg\n$err\n ... adjust your auto_path!";
    }
}
array set sqlArray {
    1 {
    CREATE TABLE IF NOT EXISTS Notes (
                      id INTEGER PRIMARY KEY AUTOINCREMENT,
                      name text,
                      note text,
                      createdDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) ,
                      updatedDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) 
                      );
    CREATE TABLE IF NOT EXISTS Version (
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        version text,
                        createdDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) ,
                        updatedDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) )
                        );
    INSERT INTO Version(version) values('1.0');
    }
    2 {
    CREATE TABLE IF NOT EXISTS Tags (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name text,
        tag text,
        createdDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) ,
        updatedDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) 
        );
    ALTER TABLE Notes ADD COLUMN dump text;
    INSERT INTO Version(version) values('2.0');
    }
    3 {
    ALTER TABLE Version ADD COLUMN sql text;
    INSERT INTO Version(version) values('3.0');
    }
}

# create db command , use in memory database for demonstration purposes
sqlite3 db :memory:

proc createSchema { sqlArray } {
    upvar $sqlArray sql
    # execute each sql script in order 
    foreach version [lsort -integer [array names sql ] ] {
    set cmd $sql($version)
    set ok 0
    while { !$ok && [string length $cmd ] } {  
        try {
        db eval $cmd
        set ok 1  ;   # it succeeded if we get here
        } on error { err backtrace } {
        if { [regexp {duplicate column name: ([a-zA-Z0-9])} [string trim $err ] match columnname ] } {
            puts "Error:  $err ... trying again" 
            set cmd [removeAlterTable $cmd $columnname ]
        } else {
            throw DBERROR "$err\n$backtrace"
        }
        }
    }
    }
}
# return sqltext with alter table command with column name removed
# if no matching alter table line found or result is no lines then
# returns ""
proc removeAlterTable { sqltext columnname } {
    set mode skip
    set result [list]
    foreach line [split $sqltext \n ] {
    if { [string first "alter table" [string tolower [string trim $line] ] ] >= 0 } {
        if { [string first $columnname $line ] } {
        set mode add
        continue;
        }
    }
    if { $mode eq "add" } {
        lappend result $line
    }
    }
    if { $mode eq "skip" } {
    puts stderr "Unable to find matching alter table line"
    return ""
    } elseif { [llength $result ] }  { 
    return [ join $result \n ]
    } else {
    return ""
    }
}
               
proc printSchema { } {
    db eval { select * from sqlite_master } x {
    puts "Table: $x(tbl_name)"
    puts "$x(sql)"
    puts "-------------"
    }
}
createSchema sqlArray
printSchema
# run again to see if we get alter table errors 
createSchema sqlArray
printSchema

প্রত্যাশিত আউটপুট

Table: Notes
CREATE TABLE Notes (
                      id INTEGER PRIMARY KEY AUTOINCREMENT,
                      name text,
                      note text,
                      createdDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) ,
                      updatedDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) 
                      , dump text)
-------------
Table: sqlite_sequence
CREATE TABLE sqlite_sequence(name,seq)
-------------
Table: Version
CREATE TABLE Version (
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        version text,
                        createdDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) ,
                        updatedDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) )
                        , sql text)
-------------
Table: Tags
CREATE TABLE Tags (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name text,
        tag text,
        createdDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) ,
        updatedDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) 
        )
-------------
Error:  duplicate column name: dump ... trying again
Error:  duplicate column name: sql ... trying again
Table: Notes
CREATE TABLE Notes (
                      id INTEGER PRIMARY KEY AUTOINCREMENT,
                      name text,
                      note text,
                      createdDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) ,
                      updatedDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) 
                      , dump text)
-------------
Table: sqlite_sequence
CREATE TABLE sqlite_sequence(name,seq)
-------------
Table: Version
CREATE TABLE Version (
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        version text,
                        createdDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) ,
                        updatedDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) )
                        , sql text)
-------------
Table: Tags
CREATE TABLE Tags (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name text,
        tag text,
        createdDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) ,
        updatedDate integer(4) DEFAULT ( cast( strftime('%s', 'now') as int ) ) 
        )
-------------

0
select * from sqlite_master where type = 'table' and tbl_name = 'TableName' and sql like '%ColumnName%'

যুক্তিযুক্ত: sqlite_master এ sql কলামে সারণি সংজ্ঞা রয়েছে, সুতরাং এটিতে অবশ্যই কলামের নামযুক্ত স্ট্রিং রয়েছে।

আপনি যেমন একটি সাব-স্ট্রিং অনুসন্ধান করছেন, এটির স্পষ্ট সীমাবদ্ধতা রয়েছে। সুতরাং আমি কলামোনামে আরও বেশি সীমাবদ্ধ সাব-স্ট্রিং ব্যবহার করার পরামর্শ দেব, উদাহরণস্বরূপ এর মতো কিছু ('`' চরিত্র হিসাবে টেস্টিংয়ের ক্ষেত্রে সবসময় থাকে না):

select * from sqlite_master where type = 'table' and tbl_name = 'MyTable' and sql like '%`MyColumn` TEXT%'

0

আমি এটি 2 টি প্রশ্নের সমাধান করি solve এটি System.Data.SQLite ব্যবহার করে আমার ইউনিটি 3 ডি স্ক্রিপ্ট।

IDbCommand command = dbConnection.CreateCommand();
            command.CommandText = @"SELECT count(*) FROM pragma_table_info('Candidat') c WHERE c.name = 'BirthPlace'";
            IDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                try
                {
                    if (int.TryParse(reader[0].ToString(), out int result))
                    {
                        if (result == 0)
                        {
                            command = dbConnection.CreateCommand();
                            command.CommandText = @"ALTER TABLE Candidat ADD COLUMN BirthPlace VARCHAR";
                            command.ExecuteNonQuery();
                            command.Dispose();
                        }
                    }
                }
                catch { throw; }
            }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.