টেবিলের অস্তিত্ব আছে কিনা তা আমি কীভাবে এসকিউএলাইটে যাচাই করব?


893

আমি কীভাবে, নির্ভরযোগ্যভাবে , এসকিউএলাইটে চেক করব, কোনও নির্দিষ্ট ব্যবহারকারীর সারণী বিদ্যমান কিনা?

আমি অবিশ্বাস্য উপায় জিজ্ঞাসা করছি না যেমন টেবিলে "নির্বাচিত *" কোনও ত্রুটি ফিরে পেয়েছে কিনা (এটি কি খুব ভাল ধারণা?)

কারণটি এরকম:

আমার প্রোগ্রামে, কিছু সারণী ইতিমধ্যে উপস্থিত না থাকলে আমার তৈরি করা এবং তারপরে পপুলেশন করা দরকার।

যদি সেগুলি ইতিমধ্যে বিদ্যমান থাকে তবে আমার কয়েকটি সারণী আপডেট করতে হবে।

প্রশ্নের মধ্যে থাকা টেবিলগুলি ইতিমধ্যে তৈরি হয়ে গেছে তার সিগন্যাল দেওয়ার পরিবর্তে আমার কি অন্য কোনও পথ অবলম্বন করা উচিত - উদাহরণস্বরূপ, আমার প্রোগ্রামের সূচনা / ডিস্কে সেটিংস ফাইলটিতে কোনও নির্দিষ্ট পতাকা তৈরি / স্থাপন / স্থাপন করে?

বা আমার পদ্ধতির অর্থ কি?


কোনও নির্বাচনের টেবিলটি বিদ্যমান না থাকলে এসকিউএলাইট একটি ব্যতিক্রম ছুঁড়ে দেবে। আর কোনও অভিনব কাজের প্রয়োজন নেই।
NoChance

34
@ এটি কোনও পরিবর্তন নেই, তবে অন্যান্য সংখ্যক জিনিসও তাই হবে। আপনার চোখ বন্ধ করে এগিয়ে গাড়ি চালিয়ে যদি সেই গাছটি সত্যিই সেখানে থাকে তবে দেখার মতো কিছুটা হলেও, আপনি একটি উপায় বা অন্য কোনও উপায় খুঁজে পাবেন :)
র্যান্ডমসক

@randomsock, চমৎকার উদাহরণ, কিন্তু একটি বিট ভীতিকর, আমার গাড়ির বিশেষভাবে যদি গাড়ী ছিল ...
NoChance

@ অ্যান্ডমসক, স্ক্লাইট কনভেনশনটি কী তা আমি জানি না, তবে অনুমতি চেয়ে ক্ষমা চেয়ে আরও বেশি অজগর। অর্থাত শর্তসাপেক্ষ ব্যবহারের পরিবর্তে ব্যতিক্রমটি ধরুন।
এরিক

1
@ এরিক এখন অবধি, প্রশ্নটি পাইথনকে জড়িত করে না তবে ধরে নিলে ত্রুটিটি একটি জেনেরিক sqlite3.OperationalError, সুতরাং আপনার তৈরির সময় আপনাকে অবশ্যই ত্রুটি বার্তাকে পার্স করতে হবে যেমন "টেবিল TABLE_NAME ইতিমধ্যে বিদ্যমান" বার্তাটি তৈরি করার সময় একটি সারণী, এবং যদি না হয় তবে ত্রুটিটি পুনরায় করুন এবং আমি মনে করি ত্রুটির বাক্য পরিবর্তন হবে না এর কোনও গ্যারান্টি নেই।
মার্কাস ফন ব্রডি

উত্তর:


1019

আমি FAQ এন্ট্রি মিস করেছি।

যাইহোক, ভবিষ্যতের রেফারেন্সের জন্য, সম্পূর্ণ কোয়েরিটি হ'ল:

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

{table_name}টেবিলের নাম কোথায় আছে তা যাচাই করতে হবে।

রেফারেন্সের জন্য ডকুমেন্টেশন বিভাগ: ডাটাবেস ফাইল ফর্ম্যাট। 2.6। এসকিউএল ডাটাবেস স্কিমা সঞ্চয় Storage

  • এটি নির্দিষ্ট নামের সাথে সারণীর একটি তালিকা ফেরত দেবে; অর্থাৎ কার্সারের 0 টি গণনা (অস্তিত্ব নেই) বা 1 এর একটি গণনা থাকবে (বিদ্যমান নেই)

7
এসকিউএলাইট ডকুমেন্টেশনের মধ্যে কোনটি এই সিস্টেমের সারণীগুলি কভার করে?
পাভেল ভেসেলভ

29
@ পাওয়েল ভেসেলভ: "এসকিউএল ডাটাবেসগুলির জন্য ফাইল ফর্ম্যাট" শিরোনামে বিভাগটি: sqlite.org/fileformat2.html
ব্রায়ান ওকলি

14
এটি যদিও টিইএমপি সারণীর জন্য কাজ করবে না। টিইএমপি সারণীগুলি "স্ক্লাইট_টেম্প_মাস্টার" এ রয়েছে।
প্যাচিফোগ

11
এটি কি বুলিয়ান ফেরত দেয়? টেবিলটি থাকে বা না থাকলে কী ফিরে আসে?
ডাগরুম

8
@ ডাগরুম এটি নির্দিষ্ট করা নাম সহ টেবিলের একটি তালিকা ফিরিয়ে দেবে; অর্থাৎ কার্সারের 0 টি গণনা (অস্তিত্ব নেই) বা 1 এর একটি গণনা থাকবে (বিদ্যমান নেই)।
রেন এস

555

আপনি যদি এসকিউএল সংস্করণ 3.3+ ব্যবহার করেন তবে আপনি সহজেই এর সাথে একটি সারণী তৈরি করতে পারেন:

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

একইভাবে, আপনি যদি কোনও টেবিলটি কেবল তখনই ব্যবহার করে সরিয়ে নিতে পারেন:

drop table if exists TableName

3
নোট করুন যে create tableবিবৃতিটি অসম্পূর্ণ (টেবিল কলামগুলির বিশদটি অনুপস্থিত)।
এরিক প্লাটোন

11
সূচকের জন্যও একই রকম নির্মাণ রয়েছে: টেবিলনেমে টেবিলনেম_কোল 1 উপস্থিত না থাকলে সূচক তৈরি করুন (কল 1)
লোটেক

26
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়, তবে যদি প্রশ্নটি অন্যরকমভাবে উচ্চারণ করা হয় would ওপিতে নামার আগে বা তৈরির আগে কোনও টেবিলটি কীভাবে পরীক্ষা করবেন তা জিজ্ঞাসা করেননি। আপনার যদি এমন কোনও টেবিলটি জিজ্ঞাসা করতে হয় যা সম্ভবত উপস্থিত নেই? এটি এখন আমি যে সমস্যার মুখোমুখি হয়েছি এবং গ্রহণযোগ্য উত্তরটি এই সাধারণ সমস্যা বিবৃতিতে সবচেয়ে ভাল কাজ করে। এটি একটি ভাল দ্রুত বিকল্প।
ডাগরুম

@ ডাগরুম, আপনি ঠিক থাকতে পারেন যদিও ওপি এটি না জিজ্ঞাসা করেছে, আমি এই উত্তরটি
খুঁজছিলাম

169

একটি পার্থক্য হ'ল নির্বাচনের নামের পরিবর্তে SELECT COUNT (*) ব্যবহার করা হবে

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

টেবিলের অস্তিত্ব না থাকলে, 0 থাকলে এটি 0 আসবে return এটি সম্ভবত আপনার প্রোগ্রামিংয়ে দরকারী যেহেতু একটি সংখ্যাসূচক ফলাফলটি দ্রুততর / প্রক্রিয়া করা সহজ। নীচে বর্ণিত হয়েছে যে আপনি কীভাবে এসকিউএলডিট ডাটাবেস, কার্সার, প্যারামিটারগুলির সাথে 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
আমি বিশ্বাস করি একটি "নির্বাচন 1" আরও দ্রুত হবে।
প্যাচ্যফিগ

কার্সার.জেটইন্ট (0) ডাটাবেসে রেকর্ড গণনার সমান কেন?
সেমিওন ড্যানিলভ

1
স্কেলাইট স্কিমে টেবলটি প্রদর্শিত হওয়ার সংখ্যাটি আমরা গণনা করছি। 0 এর একটি গণনা মানে টেবিলের অস্তিত্ব নেই। 1 এর একটি গণনা মানে টেবিলের অস্তিত্ব নেই। এগুলি গণনার একমাত্র দুটি প্রত্যাশিত মান।
স্টিফান কোয়ান

1
যদিও সংখ্যাটি (থেকে COUNT(*)) প্রক্রিয়া করা সহজ, এটি একটি সারির অস্তিত্ব ফিরিয়ে দেওয়া বা না করা আরও সহজ; যদি সেখানে একটি সারি থাকে তবে তা বিদ্যমান থাকে, যদি কোনও সারি না থাকে তবে তা হয় না। (আপনি ইতিমধ্যে মুভটোফর্স্টে ব্যর্থতার জন্য পরীক্ষা করে দেখুন, কাজটি সেই পর্যায়ে সম্পন্ন হবে))
ড্যাশ-টম-ব্যাং

আপনি মিথ্যা প্রত্যাবর্তনের আগে দয়া করে কার্সারটি বন্ধ করতে আপনার কোড আপডেট করুন।
ডেভ থমাস

43

আপনি চেষ্টা করতে পারেন:

SELECT name FROM sqlite_master WHERE name='table_name'

4
টাইপ = টেবিলটি কার্যকর হতে হবে
মাফু

যদি সি # ব্যবহার করে থাকেন তবে এই কমান্ডটি একটি SQLiteReader reader = cmd.ExecuteReader();এবং একটি dt.Load(reader)(যেখানে dtএকটি DataTable) তে ব্যবহার করবেন না । আমি দেখতে পেলাম যে টেবিলটি পাওয়া না গেলে এটি এই Object reference is not an instance of an objectব্যতিক্রমটি দেয় .Load()। পরিবর্তে, ব্যবহার SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd); ও do adapter.Fill(ds), যেখানে dsএকটি হল DataSet। তারপরে আপনি দেখতে পাবেন ds.Tables.Count > 0এবং return ds.Tables[0];যদি তাই হয় (বা else return null)। তারপর আপনি পরীক্ষা করতে পারবেন যে DataTableহচ্ছে জন্য null, যদি dt.Rows != null, এবং যদিdt.Rows.Count>0
vapcguy

34

ব্যবহার করুন:

PRAGMA table_info(your_table_name)

ফলস্বরূপ সারণি যদি খালি থাকে তবে your_table_nameঅস্তিত্ব নেই।

ডকুমেন্টেশন:

PRAGMA স্কিমা.টেবেল_ইনফো (টেবিল-নাম);

এই প্রাগমা নামযুক্ত টেবিলের প্রতিটি কলামের জন্য একটি সারি প্রদান করে। ফলাফলের সেটগুলিতে কলামগুলির মধ্যে কলামের নাম, উপাত্তের ধরণ, কলামটি NULL হতে পারে কিনা এবং কলামটির জন্য ডিফল্ট মান অন্তর্ভুক্ত। ফলাফলের সেটটিতে "পিকে" কলামটি মূল কলের অংশ নয় এমন কলামগুলির জন্য শূন্য এবং এটি প্রাথমিক কী এর অংশ থাকা কলামগুলির জন্য প্রাথমিক কীতে কলামের সূচক।

টেবিল_ইনফো প্রগমায় নামযুক্ত সারণীটিও একটি দর্শন হতে পারে।

উদাহরণ আউটপুট:

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

পাইথনে কোনও সারণী বিদ্যমান কিনা তা নির্ধারণের এটি দুর্দান্ত উপায়।
মাইকেল মারফি

অথবা জামারিন ফর্মগুলি
সেরেনিটি এখন

4
প্রোগ্রামিকভাবে কলাম সংজ্ঞাগুলি পাওয়ার এটি এক দুর্দান্ত উপায়
w00t

33

এসকিউএলাইট টেবিলের নামগুলি সংবেদনশীল, তবে তুলনাটি ডিফল্টরূপে সংবেদনশীল। এই কাজটি সব ক্ষেত্রে সঠিকভাবে করতে আপনাকে যুক্ত করতে হবে COLLATE NOCASE

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

33

যদি আপনি একটি "টেবিল ইতিমধ্যে বিদ্যমান" ত্রুটি পেয়ে থাকেন তবে এসকিউএল স্ট্রিংয়ে নীচের মত পরিবর্তন করুন:

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

এইভাবে আপনি ব্যতিক্রমগুলি এড়াতে পারবেন।



23

আপনি যদি এফএমডিবি ব্যবহার করে থাকেন তবে আমার মনে হয় আপনি কেবল এফএমডিটাবেস অ্যাডিশনগুলি আমদানি করতে এবং বুল ফাংশনটি ব্যবহার করতে পারেন:

[yourfmdbDatabase tableExists:tableName].

1
এই পদ্ধতিটি ব্যবহার করার জন্য আপনি "FMDatediaAdditions.h" আমদানি করে তা নিশ্চিত করুন বা অন্যথায় তারা কেন এটিকে সরিয়েছেন তা আপনি অবাক হবেন! :)
হবে

যদিও এটি একটি সঠিক উত্তর হতে পারে, প্রশ্নটি স্ক্লাইট সম্পর্কে ছিল কোনও নির্দিষ্ট ভাষার কোনও পাঠাগার নয়। আমি মনে করি উত্তরটি
এসকিএল

13

নিম্নলিখিত কোডটি টেবিলের অস্তিত্ব থাকলে 1 বা টেবিলে উপস্থিত না থাকলে 0 প্রদান করে returns

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

1
টেবিলের অস্তিত্ব না থাকলে এটি এখনও কিছুই ফিরিয়ে আনবে না, কারণ যেখানে শর্তটি কোনও ফলাফলকে বাধা দেয়।
ডেভিড গসমান

10

নোট করুন যে টেম্প টিএমপি ডাটাবেসে কোনও সারণী রয়েছে কিনা তা পরীক্ষা করতে আপনার sqlite_temp_masterপরিবর্তে অবশ্যই ব্যবহার করতে হবে sqlite_master:

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

9

আমি যে ফাংশনটি ব্যবহার করেছি তা এখানে:

একটি এসকিউএল ডেটাবেস অবজেক্ট = ডিবি দেওয়া হয়েছে

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

1
দুঃখের সাথে আমার এটিকে আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে ব্যবহার করতে হয়েছিল কারণ আমি দেখেছি যে স্যামসাং ডিভাইসগুলি স্ট্যান্ডার্ড স্ক্লাইট_মাস্টার সারণী কাঠামোটি ব্যবহার করে না যার সাথে প্রত্যেকে কাজ করছে।
অ্যান্টনি চুইনার্ড

7

এই কোডটি ব্যবহার করুন:

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

যদি ফিরে আসা অ্যারে গণনাটি 1 এর সমান হয় তার অর্থ টেবিলটি বিদ্যমান। অন্যথায় এটির অস্তিত্ব নেই।


4
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 এর সাথে এটি এখন আমার ম্যাকে কাজ করছে


এটি অন্য সমস্ত উত্তরের চেয়ে আরও পরিষ্কার দেখাচ্ছে .. ধন্যবাদ !!
হর্ষ বর্ধন

আমার পক্ষে কাজ করে না: টেবিল_নামের চারপাশে {} বন্ধনীগুলি মুছতে হবে, তারপরে এটি জরিমানা।
কলা

1
নিশ্চিত করুন যে table_nameঅব্যবহৃত উত্স থেকে সরবরাহ করা হয়নি (যেমন ব্যবহারকারী ইনপুট), অন্যথায় এটি এসকিউএল ইঞ্জেকশনের পক্ষে ঝুঁকিপূর্ণ হবে। পাঠ্য ম্যানিপুলেশন কৌশলগুলির পরিবর্তে পরামিতিগুলি ব্যবহার করা সর্বদা ভাল
astef

3

ব্যবহার

SELECT 1 FROM table LIMIT 1;

সমস্ত রেকর্ড পড়া থেকে রোধ করতে।


টেবিলটি উপস্থিত থাকলে কিন্তু এতে কোনও রেকর্ড না থাকলে এটি NULL প্রদান করে।
রেডিওস্পিল 12

যদি টেবিলটি বিদ্যমান না থাকে তবে এটি একটি ত্রুটি ছুঁড়ে দেবে। এটি ধরুন এবং আপনি জানেন যে এটির অস্তিত্ব নেই।
ভাগ্যডায়োনাল্ড

ফ্লো কন্ট্রোল হিসাবে ত্রুটি হ্যান্ডলিং ব্যবহার করা সাধারণত সেরা অনুশীলন হিসাবে বিবেচিত হয় না। এটি সম্ভবত এড়ানো উচিত।
জেফ উডার্ড

3

আপনি সারণির অস্তিত্ব পরীক্ষা করতে নীচের ক্যোয়ারীটি লিখতে পারেন।

SELECT name FROM sqlite_master WHERE 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'

6
9 বছর আগের তুলনায় এটি ইতিমধ্যে গৃহীত শীর্ষস্থানীয় উত্তরের থেকে কীভাবে আলাদা?
কেভিন ভ্যান ডাইক

3

আমি এখনই সি # তে সবচেয়ে নির্ভরযোগ্য উপায়টি খুঁজে পেয়েছি, এসকিউএলাইট 3 ব্যবহার করা সর্বশেষ স্ক্লাইট-নেট-পিসিএল নুগেট প্যাকেজ (1.5-231) ব্যবহার করে:

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

2

একটি সহজ নির্বাচন জিজ্ঞাসা - আমার মতে - বেশ নির্ভরযোগ্য in সর্বোপরি এটি অনেকগুলি বিভিন্ন ডাটাবেসের ধরণের (এসকিউএলাইট / মাইএসকিউএল) সারণীর অস্তিত্ব পরীক্ষা করতে পারে।

SELECT 1 FROM table;

কোয়েরিটি সফল হয়েছে কিনা তা নির্ধারণের জন্য আপনি অন্যান্য নির্ভরযোগ্য প্রক্রিয়াটি ব্যবহার করতে পারেন (এটি উদাহরণস্বরূপ, আপনি Qt এ QSqlQuery এর মাধ্যমে একটি ডেটাবেসকে জিজ্ঞাসা করেছেন ) যখন তা বোঝা যায় ।


1

সি ++ ফাংশন চেক করে ডিবি এবং সমস্ত সংযুক্ত ডাটাবেস টেবিলের উপস্থিতি এবং (allyচ্ছিকভাবে) কলামের জন্য।

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;
}

সম্পাদনা: সম্প্রতি স্ক্লাইট 3_সামগ্রী_ কলাম_মেডাটাটা ফাংশনটি আবিষ্কার হয়েছে। অত: পর

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;}

পাবলিক স্ট্যাটিক বুলিয়ান টেবিলএক্সিস্টস (এসকিউএলডিট ডাটাবেস ডাটাবেস, স্ট্রিং টেবিলনেম) {ডাটাবেস.অরওয়াকুওয়ারি ("স্কেলাইট_মাস্টার থেকে নাম নির্বাচন করুন যেখানে টাইপ = 'টেবিল' এবং নাম = '" টেবিলনাম + "", নাল) .মোভটোফার্স্ট (); }
নিক

স্ট্রিং কনটেন্টেশন হিসাবে খুব অদক্ষ ও ঝুঁকিপূর্ণ উপায়ে সব কিছু শেষ হতে পারে।
Andrea Moro

0

এটি এসকিউএল কর্ডোভা জন্য আমার কোড:

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)
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.