উত্পন্ন .sql
ফাইলটি আমদানির প্রক্রিয়াটি "স্বয়ংক্রিয়" করার জন্য , সমস্ত ট্র্যাপগুলি এড়িয়ে গিয়ে ফাইলগুলি পাস করার চেষ্টা করার মধ্যে লুকানো যেতে পারে stdin
এবং stdout
কেবল মাইএসকিউএলকে মাইএসকিউএল কমান্ডটি .sql
ব্যবহার করে উত্পন্ন ফাইলটি কার্যকর করতে বলে toSOURCE
ক্ষিতিজ সুদ থেকে সংক্ষেপে সংক্ষিপ্ত, তবে দুর্দান্ত উত্তরটি উত্তম সূচনার পয়েন্টটি দেয়। সংক্ষেপে, ক্ষিতিজ সুদের সিনট্যাক্স অনুযায়ী ওপি'র কমান্ডটি সংশোধন করুন এবং কমান্ডের সাথে কমান্ডগুলি প্রতিস্থাপন করুন SOURCE
:
#!/bin/bash
mysql -u$user -p$password $dbname -Bse "SOURCE ds_fbids.sql
SOURCE ds_fbidx.sql"
উত্পন্ন .sql
ফাইলের মধ্যে ডাটাবেসের নাম অন্তর্ভুক্ত করা থাকলে , এটি কমান্ড থেকে বাদ দেওয়া যাবে।
এখানে অনুমান করা হয় যে উত্পন্ন ফাইলটি তার নিজের হিসাবে একটি ফাইল হিসাবে বৈধ.sql
। ফাইলটি পুনঃনির্দেশিত, পাইপযুক্ত বা শেল দ্বারা পরিচালিত অন্য কোনও পদ্ধতিতে না করে শেলের কারণে উত্পন্ন আউটপুটে কোনও অক্ষর থেকে রক্ষা পাওয়ার কোনও সমস্যা নেই। একটি .sql
ফাইলের মধ্যে যা পালাতে হবে সে সম্পর্কে নিয়মগুলি অবশ্যই প্রয়োগ করা হয়।
কমান্ড লাইনের পাসওয়ার্ড, বা কোনও my.cnf
ফাইল ইত্যাদিতে সুরক্ষা সম্পর্কিত সমস্যাগুলি কীভাবে মোকাবেলা করা যায় , তার উত্তরে কিছু উত্তম পরামর্শ সহ অন্যান্য উত্তরে সুরাহা করা হয়েছে। ড্যানির কাছ থেকে আমার প্রিয় উত্তরটি কভার করে, যখন চাকরির সাথে কাজ করার সময় কীভাবে সমস্যাটি পরিচালনা করা যায় বা অন্য যে কোনও কিছু সহ coverscron
আমি যে সংক্ষিপ্ত উত্তরে উল্লেখ করেছি একটি মন্তব্যে (প্রশ্ন?) সম্বোধন করার জন্য: না, শেল কমান্ড যেমন দেওয়া হয়েছে তেমন এটি কোনও হারডোক সিনট্যাক্সের সাহায্যে ব্যবহার করা যাবে না। HEREDOC পুনর্নির্দেশ সংস্করণ সিনট্যাক্সে ব্যবহার করা যেতে পারে ( -Bse
বিকল্প ছাড়াই ), যেহেতু I / O পুনর্নির্দেশটি হেরডোকের চারপাশে নির্মিত। যদি আপনার HEREDOC এর কার্যকারিতা প্রয়োজন হয় .sql
তবে এটি কোনও ফাইলের তৈরিতে এটি অস্থায়ী হলেও এমনটি হওয়া ভাল এবং মাইএসকিউএল ব্যাচ লাইনের সাথে চালিত করতে "ফাইলটি" কমান্ড "হিসাবে ব্যবহার করা ভাল।
#!/bin/bash
cat >temp.sql <<SQL_STATEMENTS
...
SELECT \`column_name\` FROM \`table_name\` WHERE \`column_name\`='$shell_variable';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql
মনে রাখবেন যে শেল সম্প্রসারণের কারণে আপনি শ্বেত এবং পরিবেশ পরিবর্তনশীলগুলি HEREDOC এর মধ্যে ব্যবহার করতে পারেন। ডাউন-সাইডটি হ'ল আপনাকে অবশ্যই প্রতিটি ব্যাকটিক এড়িয়ে চলতে হবে। মাইএসকিউএল এগুলি সনাক্তকারী হিসাবে ডিলিমিটার হিসাবে ব্যবহার করে তবে শেলটি, যা প্রথমে স্ট্রিং পায়, এগুলিকে এক্সিকিউটেবল কমান্ড ডিলিমিটার হিসাবে ব্যবহার করে। মাইএসকিউএল কমান্ডের একক ব্যাকটিকিতে পালানো মিস করুন এবং পুরো জিনিসটি ত্রুটির সাথে বিস্ফোরিত হয়। HEREDOC এর জন্য একটি উদ্ধৃত সীমাবদ্ধতা ব্যবহার করে পুরো বিষয়টি সমাধান করা যেতে পারে:
#!/bin/bash
cat >temp.sql <<'SQL_STATEMENTS'
...
SELECT `column_name` FROM `table_name` WHERE `column_name`='constant_value';
...
SQL_STATEMENTS
mysql -u $user -p$password $db_name -Be "SOURCE temp.sql"
rm -f temp.sql
শেল সম্প্রসারণটি সেভাবে অপসারণ করা ব্যাকটিক্স এবং অন্যান্য শেল-বিশেষ অক্ষরগুলি থেকে পালানোর প্রয়োজনীয়তা দূর করে। এটি এর মধ্যে শেল এবং পরিবেশের ভেরিয়েবলগুলি ব্যবহার করার ক্ষমতাও সরিয়ে দেয়। এটি প্রায়শই শেল স্ক্রিপ্টের সাথে শুরু করার জন্য একটি হারডোক ব্যবহার করার সুবিধাগুলি সরিয়ে দেয়।
অন্য বিকল্পটি হ'ল ব্যাশ সিনট্যাক্স সংস্করণ (এর সাথে -Bse
) সহ ব্যাশটিতে অনুমোদিত মাল্টি-লাইন উদ্ধৃত স্ট্রিংগুলি ব্যবহার করা । আমি অন্য শাঁসগুলি জানি না, তাই তারা যদি এটিতেও কাজ করে তবে আমি বলতে পারি না। আপনার যে কোনওভাবে কমান্ডের মাধ্যমে একাধিক .sql
ফাইল চালিত করার জন্য এটি ব্যবহার করতে হবে SOURCE
, যেহেতু এটি অন্য মাইএসকিউএল কমান্ডগুলি যেমন কোনও দ্বারা শেষ হয় না;
, এবং প্রতি লাইনে কেবল একটির অনুমতি রয়েছে। মাল্টি-লাইন স্ট্রিং শেল প্রসারণের স্বাভাবিক প্রভাব সহ একক বা ডাবল উদ্ধৃতিযুক্ত হতে পারে। এতে ব্যাকটিক্স ইত্যাদির জন্য HEREDOC সিনট্যাক্স ব্যবহারের মতো একই ক্যাভেট রয়েছে etc.
.sql
ওপি-র মতো ফাইল তৈরি করার জন্য একটি স্ক্রিপ্টিং ভাষা, পার্ল, পাইথন ইত্যাদি SOURCE
ব্যবহার করা এবং তারপরে সরল কমান্ড সিনট্যাক্স ব্যবহার করে সেই ফাইলটি তৈরি করার সম্ভাব্যতর উন্নত সমাধান হতে পারে । স্ক্র্যাপিংয়ের ভাষাগুলি শেলের চেয়ে স্ট্রিং ম্যানিপুলেশনে অনেক ভাল, এবং মাইএসকিউএল নিয়ে কাজ করার সময় প্রয়োজনীয় উদ্ধৃতি এবং পালানোর প্রয়োজনের জন্য বেশিরভাগ অন্তর্নিহিত পদ্ধতি রয়েছে।