রেলগুলিতে কোনও টেবিল রয়েছে কিনা তা পরীক্ষা করুন


174

আমার একটি রেক টাস্ক রয়েছে যা টেবিলের অস্তিত্ব না থাকলে কাজ করবে না। আমি একটি ওয়েবসাইটে ২০ টিরও বেশি ইঞ্জিনিয়ারের সাথে কাজ করছি তাই আমি নিশ্চিত করতে চাই যে তারা কোনও রেক টাস্ক করার আগে তারা টেবিলটি স্থানান্তরিত করেছে যা এটি সম্পর্কিত টেবিলটি তৈরি করবে।

এআর যেমন একটি পদ্ধতি আছে Table.exists? তারা কীভাবে নিশ্চিত করতে পারি যে তারা সফলভাবে টেবিলটি স্থানান্তরিত করেছে?


12
রসিকতাটি চলে যায় .. কোনও টেবিলটি স্থানান্তর করতে কত প্রকৌশলী লাগবে :)
জাব্বা

1
উত্পাদনে 1. স্টেজিংয়ে কয়েক ডজন এবং একাধিকবার।
ততদিনে

2
আপনার রাক টাস্কটি শুরু করার পরে কীভাবে এই স্থানান্তরগুলি চালানো সহজ হবে না? সুতরাং আপনাকে টেবিলগুলি হারিয়ে যাওয়ার বিষয়ে চিন্তা করতে হবে না।
রাশখাদফি

@ রাশখাদফি: নোট করুন যে অনুপস্থিত সারণীগুলি আপনাকে কোনও সমস্যা দিতে চলেছে যদি আপনার কনফিগারেশন / আরম্ভকারীরা সেগুলি ব্যবহার করে। (অর্থাত্ rake db:migrateব্যর্থ হবে।)
ocodo

উত্তর:


302

5 রেলগুলিতে এপিআই সারণী / দর্শন , সম্মিলিতভাবে ডেটা উত্স সম্পর্কিত স্পষ্ট হয়ে ওঠে

# Tables and views
ActiveRecord::Base.connection.data_sources
ActiveRecord::Base.connection.data_source_exists? 'kittens'

# Tables
ActiveRecord::Base.connection.tables
ActiveRecord::Base.connection.table_exists? 'kittens'

# Views
ActiveRecord::Base.connection.views
ActiveRecord::Base.connection.view_exists? 'kittens'

কারাগারে 2, 3 এবং 4 এপিআই প্রায় টেবিল রয়েছে

# Listing of all tables and views
ActiveRecord::Base.connection.tables

# Checks for existence of kittens table/view (Kitten model)
ActiveRecord::Base.connection.table_exists? 'kittens'

মাইগ্রেশনগুলির স্থিতি পাওয়া:

# Tells you all migrations run
ActiveRecord::Migrator.get_all_versions

# Tells you the current schema version
ActiveRecord::Migrator.current_version

মাইগ্রেশন বা মেটাডেটার জন্য আপনার যদি আরও এপিআই দরকার হয় তা দেখুন:


4
ActiveRecord::Base.connection.table_exist 'users'ব্যবহারকারীর টেবিলের জন্য পরীক্ষা করতে হবে।
ততদিনে

4
ActiveRecord::Base.connection.table_exists? 'kittensএকটি বিড়ালছানা টেবিল জন্য পরীক্ষা করতে হবে। আমি যদি সব বিড়ালছানা ধ্বংস না করি! drop_table :kittens
ততদিনে

1
ধন্যবাদ বন্ধুরা! আমি সবেমাত্র ব্যবহার করেছি.index_exists?('kittens', 'paws')
ট্রিপ

14
এটি অ্যাক্টিভেকর্ড 3.2.11 drop_table(:hosts_users) if table_exists? :hosts_users
গ্রেগ

1
ActiveRecord::Base.connection.data_source_exists? 'table_name'এখনই সঠিক
ডোরিয়ান

57

এমনকি সারণী বিদ্যমান না থাকলেও:

মডেল Kitten, প্রত্যাশিত টেবিল kittens রেল 3:

Kitten.table_exists? # => মিথ্যা


+ 1 আরও মার্জিত সমাধান। মডেলটি টেবিলের নামটিকে ওভাররাইড করলেও কাজ করে।
ড্যানিয়েল রিকোভস্কি

1
এটি ব্যর্থ 2.3.18-lts (একটি টেবিলের সাথে পরীক্ষিত, স্ক্রিপ্ট / কনসোল চালানোর আগে একটি অনুপস্থিত) এর সাথে এটির কাজ নিশ্চিত করে
Iheggie

32

আমি মাইগ্রেশনের মাধ্যমে একটি টেবিল অপসারণ করার সময় এটি খুঁজে পেয়েছি:

drop_table :kittens if (table_exists? :kittens)
ActiveRecord::Migration.drop_table :kittens if (ActiveRecord::Base.connection.table_exists? :kittens)

3.2 রেল জন্য কাজ করে

এই সহজ ফর্মটি 5 রেলগুলিতে উপলব্ধ হবে:

drop_table :kittens, if_exists: true

তথ্যসূত্র: https://github.com/rails/rails/pull/16366

এবং এখানে পাগল 5 ActiveRecord এর এর পরিবর্তণের :

ড্রপ_ টেবিলের জন্য: if_exists বিকল্পটি পরিচয় করিয়ে দিন।

উদাহরণ:

drop_table(:posts, if_exists: true)

এটি কার্যকর করা হবে:

DROP TABLE IF EXISTS posts

যদি টেবিলটি বিদ্যমান না থাকে, if_exists: মিথ্যা (ডিফল্ট) একটি ব্যতিক্রম উত্থাপন করে যেখানে if_exists: সত্য কিছুই করে না।


টেবিলটি বাস্তবে একটি দৃশ্য হিসাবে দেখা গেলে এটি ব্যর্থ হবে, কারণ টেবিলটি উপস্থিত থাকবে বলে মনে হয়, তবে ড্রপ টেবিল এটিকে ফেলে দিতে পারে না।
এমসিআর

8

রেল 5.1

if ActiveRecord::Base.connection.data_source_exists? 'table_name'
   drop_table :table_name
end

অথবা

drop_table :table_name, if_exists: true

2
table_exists এখনও রেল -5 এ কাজ করে তবে এর আচরণটি কেবলমাত্র চেক টেবিলগুলিতে পরিবর্তিত হবে। 5.0.1 হিসাবে এটি ভিউ এবং টেবিলগুলি পরীক্ষা করে। ডেটা_সোর্স_একস্টগুলি রাখে যে আচরণ এবং টেবিল_একস্টগুলি কেবল চেক টেবিলগুলিতে পরিবর্তিত হবে।
জন নাইলে

তিনি মাইগ্রেশনে টেবিলটি চেক করতে বলছেন না, তাকে নিশ্চিত হওয়া দরকার যে টেবিলটি
রেক টাস্কটিতে রয়েছে

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