আপনি কি ডিলগুলিতে ডিবি ব্যবহারকারী নাম, pw, ডাটাবেসের নাম পেতে পারেন?


146

আমি একটি রেক টাস্ক লিখছি যা রেল / অ্যাক্টিভেকর্ডের বাইরে কিছু ডিবি কাজ করে।

সংজ্ঞায়িত হিসাবে বর্তমান পরিবেশের জন্য ডিবি সংযোগ তথ্য (হোস্ট, ব্যবহারকারীর নাম, পাসওয়ার্ড, ডিবি নাম) পাওয়ার কোনও উপায় আছে কি database.yml?

আমি এটি পেতে চাই যাতে আমি এটির সাথে সংযোগ স্থাপনের জন্য এটি ব্যবহার করতে পারি ...

con = Mysql.real_connect("host", "user", "pw", "current_db")

উত্তর:


244

রেলগুলির মধ্যে থেকে আপনি একটি কনফিগারেশন অবজেক্ট তৈরি করতে এবং এটি থেকে প্রয়োজনীয় তথ্য পেতে পারেন:

config   = Rails.configuration.database_configuration
host     = config[Rails.env]["host"]
database = config[Rails.env]["database"]
username = config[Rails.env]["username"]
password = config[Rails.env]["password"]

বিশদের জন্য ডকুমেন্টেশন দেখুন :: কনফিগারেশন বিশদ।

এটি কেবল ডাটাবেস কনফিগারেশন ফাইল ( ) থেকে কনফিগারেশন লোড করতে YAML :: লোডdatabase.yml ব্যবহার করে যা রেল পরিবেশের বাইরে থেকে তথ্য পেতে আপনি নিজেকে ব্যবহার করতে পারেন:

require 'YAML'
info = YAML::load(IO.read("database.yml"))
print info["production"]["host"]
print info["production"]["database"]
...

27
সাম্প্রতিকতম রেলগুলিতে আপনার কনফিগারেশনটি তৈরি করার দরকার নেই, আপনি এটির মাধ্যমে পেতে পারেনRails.configuration
ব্রায়ান লারসেন

রেল 3.0.০.০ এর জন্য, 'ইয়ামল' এবং ওয়াইএএমএল :: লোডের প্রয়োজন (আইও.ড্রেড ("কনফিগারেশন / ডাটাবেস.আইএমএল")) ভাল কাজ করে!
আরিভরাসান এল

এর মধ্যে যদি কিছুগুলির শূন্য মান থাকে (আমার ক্ষেত্রে: হোস্ট, ব্যবহারকারীর নাম এবং পাসওয়ার্ড), রেলগুলি ব্যবহার করবে এমন ডিফল্টগুলি কী কী?
ডেনিস

3
ওয়াইএএমএল ব্যবহার সম্পর্কে যত্নবান - রেলের আধুনিক সংস্করণগুলিও প্রথমে ERB এর মাধ্যমে ফাইলের সামগ্রীগুলি ফিল্টার করবে।
কেলভিন

@ ব্রায়ানালারসেন কোওউউলিডাডে আইয়ুওউইউইচইল্লাইসাইববিওরাইস্যাটিসি?? ̶ ̶ ̶R̶a̶i̶l̶s̶.̶c̶o̶n̶f̶i̶g̶u̶r̶a̶t̶i̶o̶n̶̶ ̶̶̶̶̶̶̶̶̶ ̶̶̶̶̶ answer answer̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶ ̶̶̶̶̶̶ আমি @ কেনব উত্তরটি দেখতে পাচ্ছি।
2-10 এ mlt

156

উপরের মন্তব্যে ব্রায়ানের উত্তরটি আরও কিছুটা এক্সপোজারের দাবিদার:

>> Rails.configuration.database_configuration[Rails.env]
=> {"encoding"=>"unicode", "username"=>"postgres", "adapter"=>"postgresql", "port"=>5432, "host"=>"localhost", "password"=>"postgres", "database"=>"mydb", "pool"=>5}

7
হেরোকুতে 4.1 কিলগুলিতে আপগ্রেড করার জন্য, আমাকে এই লাইনটি স্যুইচ করতে হয়েছিল: অ্যাক্টিভেকর্ড :: বেসকোন কনফিগারেশন [রেইলস.এনভি]
কয়েনজেন

82
ActiveRecord::Base.connection_config

একটি হ্যাশে সংযোগ কনফিগারেশন প্রদান করে:

=> {:adapter=>ADAPTER_NAME, :host=>HOST, :port=>PORT, 
    :database=>DB, :pool=>POOL, :username=>USERNAME, 
    :password=>PASSWORD} 

tpettতাদের মন্তব্যে যেমন মন্তব্য করা হয়েছে: এই সমাধানটি database.ymlপরিবেশ পরিবর্তনশীল থেকে এবং কনফিগারেশনটি মার্জ করার জন্য অ্যাকাউন্ট করে DATABASE_URL


10
এটিই একমাত্র বলে মনে হয় যে পরিবেশের ভেরিয়েবলের database.ymlসাথে কনফিগারেশনটি মার্জ করার জন্য অ্যাকাউন্ট রয়েছে DATABASE_URL
টেপেট

আমি অন্য কারও পক্ষে কথা বলতে পারি না, তবে এটি নিখুঁত। আমি প্রোগ্রামটিমে ডাবল চেক করতে চেয়েছিলাম যে আমি সঠিক ডাটাবেসের দিকে ইশারা
করছিলাম

3

আমি মনে করি এটিই সহজ সমাধান। কিছু পরীক্ষার পরে (কমপক্ষে 5.2 কারাগারে) এটি DATABASE_URL সঠিকভাবে সমাধান করবে।

 ActiveRecord::Base.configurations[Rails.env]

1

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

<% 
    require 'parseconfig'
    c=ParseConfig.new('../../.my.cnf') %>

mysqlevn: &mysql
  adapter: mysql 
  username: <%= c.params['client']['user'] %>
  password: <%= c.params['client']['password'] %>
  host: localhost 
  socket: <%= [ 
  '/var/run/mysqld/mysqld.sock',
  '/var/lib/mysql/mysql.sock',
  '/tmp/mysqld.sock',
  '/tmp/mysql.sock'].detect { |socket| File.exist?(socket) } %>

production:
  database: app_production
  <<: *mysql


development:
  database: app_development 
  <<: *mysql

# Do not set this db to the same as development or production.
test:
  database: app_test
  <<: *mysql

রেফ: http://effectif.com/articles/datedia-yml-should-be-checked-in

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