PostgreSQL: কমান্ড লাইন থেকে পরামিতিগুলি কীভাবে পাস করবেন?


95

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

উদাহরণ:

SELECT  * 
FROM    foobar
WHERE   foo = ?
   AND  bar = ?
    OR  baz = ?  ;

এর মতো কিছু খুঁজছেন:

%> {select * from foobar where foo=? and bar=? or baz=? , 'foo','bar','baz' };

আরও প্রসঙ্গ, দয়া করে। এই কোয়েরিটি কি কোনও এসকিউএল ফাইলে, পার্ল / পাইথন / রুবি / <এখানে প্রিয় স্ক্রিপ্টিং ভাষা >োকান> স্ক্রিপ্টে বা অন্য কোনও জায়গায়?

@ জ্যাক: আমি পিএসকিএল প্রম্পট (কমান্ড লাইন) থেকে সরাসরি এটি করতে চাইছি। আমি আমার কোডটি একটি স্ক্রিপ্ট থেকে নিচ্ছি, তবে পুরো অনুসন্ধান / প্রতিস্থাপন প্রক্রিয়াটি পুরোপুরি যেতে চাই না।
ভোলআরন

@ ভোলআরন, পিএসকিএল কমান্ড লাইনের উদাহরণের জন্য দয়া করে নীচে আমার উত্তরটি দেখুন।
এমএব্রাহাম 1

4
@ এমএব্রাহাম ১: দুর্দান্ত। আমার প্রশ্নের আমার আরও কিছু পটভূমি দেওয়া উচিত ছিল। আমার কাছে প্রচুর স্ক্রিপ্ট রয়েছে যাতে খোলা লেখায় এসকিউএল থাকে। কখনও কখনও এটি কার্যকর এবং এটি ডিবাগিংয়ের জন্য কাস্টম মানগুলির সাথে সরাসরি ডাটাবেসের বিরুদ্ধে হিট করা কার্যকর। আমি পোস্টগ্র্রেস ডাব্লু / ও এর অতিরিক্ত ফাইলগুলি সংরক্ষণ করার জন্য এটি সহজেই করার উপায় খুঁজছিলাম।
ভোলআরন

@ ভলিউরন, ধন্যবাদ আমি ব্যাচের কাজের ক্ষেত্রে বিবেচনা করছি, তবে আপনার পাশাপাশি খোলার এসকিউএল-তেও টোকেনগুলি ব্যবহার করতে সক্ষম হওয়া উচিত। আপনি আমার উত্তর পছন্দ করে যদি ভোট আপ ভুলবেন না।
এমএব্রাহাম 1

উত্তর:


181

আপনি -v কনস্ট্রাক্ট যেমন ব্যবহার করতে পারেন

psql -v v1=12  -v v2="'Hello World'" -v v3="'2010-11-12'"

এবং তারপরে স্কয়ারের ভেরিয়েবলগুলি: v1,: v2 ইত্যাদি হিসাবে উল্লেখ করুন

select * from table_1 where id = :v1;

দয়া করে দুটি উদ্ধৃতি ব্যবহার করে আমরা কীভাবে স্ট্রিং / তারিখের মানটি পাস করি সেদিকে মনোযোগ দিন " '...' "


4
+1 আকর্ষণীয়, নাম যুক্তিগুলি পাস করে। আপনি একবার লগ ইন করার জন্য কোনও উপায় সম্পর্কে অবগত আছেন?
ভোলআরন

9
অবশ্যই, ব্যবহার করুন \set v3 'another value'। শুধু মনে রাখবেন, যখন আপনাকে এসকিউএল স্টেটমেন্টে মানটি উদ্ধৃত করার দরকার হয়, ভেরিয়েবল নামের চারপাশে SELECT * FROM foo WHERE bar = :'v3';
অ্যাস্টোস্ট্রোফ ব্যবহার করুন

4
আমার ধারণা তারা এগুলি পেয়েছেawk
নিল ম্যাকগুইগান

4
@ এর পরিবর্তে @ ব্যবহার করা যায়: স্কেলসার্ভারের মতো
মাহমুদ

4
দ্রষ্টব্য, এটি পড়ার পরে আমি প্রত্যাশা করেছিলাম যে -v এর সাথে নির্ধারিত ভেরিয়েবলগুলি -c এর সাথে চালানো কমান্ডগুলিতে উপলব্ধ হবে তবে হায়, হায় সেগুলি নেই। অন্য কথায়, psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'" -c 'select * from table_1 where id = :v1;' একটি সিনট্যাক্স ত্রুটি উত্পন্ন করবে। তবে, যদি বাশ আপনার শেল হয় তবে আপনি চেষ্টা করতে পারেন: psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'" <<< 'select * from table_1 where id = :v1;' ভাল প্রভাবের জন্য।
ম্যালকুক

31

পোস্টগ্রাইএসকিউএলে পাওয়া গেছে, আপনি কোনও স্ক্রিপ্টিং ভাষায় যেমন PREPAREবক্তব্য রাখতে পারেন ঠিক তেমন স্টেটমেন্টও দিতে পারেন। দুর্ভাগ্যক্রমে, আপনি এখনও ব্যবহার করতে পারবেন না ?, তবে আপনি $nস্বরলিপি ব্যবহার করতে পারেন ।

উপরের উদাহরণ ব্যবহার করে:

PREPARE foo(text,text,text) AS
    SELECT  * 
    FROM    foobar
    WHERE   foo = $1
       AND  bar = $2
        OR  baz = $3  ;
EXECUTE foo('foo','bar','baz');
DEALLOCATE foo;

@ ইভানব্ল্যাক এর সাথে আপনি অন্তর্ভুক্ত করার মতো আরও কিছু ছিল? :)
ডিএলোকেশনটি

কেবলমাত্র নোট করুন যে বর্তমান সেশনটি বন্ধ না থাকা অবস্থায় এখন fooব্যস্ত এবং অন্যটির অন্য PREPAREএকটি নাম থাকা উচিত। তোমার সাথে খেলতে পারেন PREPAREমধ্যে psqlএটি একটি নতুন নাম প্রতিটি সময় উদ্ভাবিত করা কঠিন এবং DEALLOCATEএটা দিয়ে সাহায্য করতে পারেন =)
ইভান কালো

এটি উল্লেখ করার জন্য ধন্যবাদ। আমি কিছু সময় প্রস্তুতি ব্যবহার করি নি, তবে এটি দরকারী তথ্য
vol7ron

এই সমাধানটি আইএমও খুব ভাল। একটি দরকারী পার্শ্ব প্রতিক্রিয়া - আপনি সহজেই প্রস্তুত বিবৃতিটি একাধিকবার কল করতে পারেন।
ইউরি

14

পিএসকিএল-তে একটি পদ্ধতি রয়েছে

\set name val

কমান্ড, যা -v name=valকমান্ড-লাইন বিকল্পের সাথে আবদ্ধ হওয়ার কথা । উদ্ধৃতিটি বেদনাদায়ক, বেশিরভাগ ক্ষেত্রে পুরো ক্যোয়ারী মাংসকে শেল-ডকুমেন্টের মধ্যে রাখা আরও সহজ।

সম্পাদনা করুন

ওহো, আমার -vপরিবর্তে এটি বলা উচিত ছিল -P(যা ফরম্যাটিং বিকল্পগুলির জন্য) পূর্ববর্তী উত্তরটি এটি সঠিকভাবে পেয়েছে।


7

আপনি পিএসকিএল কমান্ড-লাইনে বা একটি ব্যাচ ফাইল থেকে প্যারামিটারগুলি পাস-ইন করতে পারেন। প্রথম বিবৃতি আপনার ডাটাবেসের সাথে সংযোগের জন্য প্রয়োজনীয় বিশদ সংগ্রহ করে।

চূড়ান্ত প্রম্পটটি সীমাবদ্ধ মানগুলির জন্য জিজ্ঞাসা করে, যা WHERE কলামে IN () ধারাটিতে ব্যবহৃত হবে। একক-উক্তি মনে রাখবেন যদি স্ট্রিং থাকে এবং কমা দ্বারা পৃথক হয়:

@echo off
echo "Test for Passing Params to PGSQL"
SET server=localhost
SET /P server="Server [%server%]: "

SET database=amedatamodel
SET /P database="Database [%database%]: "

SET port=5432
SET /P port="Port [%port%]: "

SET username=postgres
SET /P username="Username [%username%]: "

SET /P bunos="Enter multiple constraint values for IN clause [%constraints%]: "
ECHO you typed %constraints%
PAUSE
REM pause
"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h %server% -U %username% -d %database% -p %port% -e -v v1=%constraints% -f test.sql

এখন আপনার এসকিউএল কোড ফাইলে, আপনার যেখানে বিধি বা এসকিউএল এর অন্য কোথাও এর মধ্যে ভি 1 টোকেন যুক্ত করুন। দ্রষ্টব্য যে টোকেনগুলি কেবল একটি ফাইল নয়, একটি খোলা এসকিউএল স্টেটমেন্টেও ব্যবহার করা যেতে পারে। এটি পরীক্ষা হিসাবে সংরক্ষণ করুন। Sql:

SELECT * FROM myTable
WHERE NOT someColumn IN (:v1);

উইন্ডোজে, পুরো ফাইলটিকে ডস ব্যাচ ফাইল (.bat) হিসাবে সংরক্ষণ করুন, একই ডিরেক্টরিতে test.sql সংরক্ষণ করুন এবং ব্যাচ ফাইলটি চালু করুন।

মূল উত্সাহিত স্ক্রিপ্টটির জন্য এন্টারপ্রাইজডিবি এর ডেভ পেজের জন্য ধন্যবাদ।


উইন্ডোজ উদাহরণের জন্য +1; যদিও বেশিরভাগ পিজি ডাটাবেস একটি * নিক্স রূপে বিদ্যমান
ভোলআরন

2

এটি প্রদর্শিত হবে যে আপনি যা চান তা সরাসরি কমান্ড লাইন থেকে করা যায় না । হয় আপনাকে পিএলপিএলএসকিএল-তে একটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশন ব্যবহার করতে হবে বা কোনও স্ক্রিপ্টিং ভাষা থেকে কোয়েরিটি কল করতে হবে (এবং পরবর্তী পদ্ধতিটি এসকিউএল ইঞ্জেকশনটি এড়াতে কিছুটা সহজ করে তোলে)।


আমি ছিলাম না - অনেক সময় আমি আশা করি যে ডাউনভোটদের কোনও প্রকার ব্যাখ্যা (যেমন প্রশ্নগুলি বন্ধ করার জন্য আমরা কেন ভোট দিয়েছি তার অনুরূপ), যদিও বেনামে ছেড়ে দেওয়া হয় should
ভোলআরন

0

আমি @ ম্যালকুকের মন্তব্যে (বাশ ব্যবহার করে) অনুপ্রাণিত হয়ে আরও একটি উত্তর দিতে চাই।

পতাকাটি ব্যবহার করার সময় আপনার ক্যোয়ারির মধ্যে শেল ভেরিয়েবলগুলি ব্যবহার-c করার প্রয়োজন হলে এই বিকল্পটি আপনার পক্ষে কাজ করতে পারে । বিশেষত, আমি একটি টেবিলের গণনা পেতে চেয়েছিলাম, যার নাম ছিল শেল ভেরিয়েবল (যা আপনি ব্যবহার করার সময় সরাসরি পাস করতে পারবেন না -c)।

ধরে নিন আপনার শেল ভেরিয়েবল রয়েছে

$TABLE_NAME='users'

তারপরে আপনি এটি ব্যবহার করে ফলাফলগুলি পেতে পারেন

psql -q -A -t -d databasename -c <<< echo "select count(*) from $TABLE_NAME;"

( -q -A -tকেবলমাত্র অতিরিক্ত বিন্যাস ছাড়াই ফলাফলের সংখ্যা মুদ্রণ করা)

আমি নোট করব যে echoএখানে-স্ট্রিংয়ের মধ্যে ( <<<অপারেটর) প্রয়োজনীয় নাও হতে পারে, আমি প্রথমে ভেবেছিলাম নিজের দ্বারা উদ্ধৃতিগুলি ভাল হবে, সম্ভবত কেউ এর কারণ ব্যাখ্যা করতে পারে।


0

আমি @ ভোলআরন উত্তরের আরও ভাল সংস্করণ ব্যবহার করে শেষ করেছি:

DO $$
BEGIN
    IF NOT EXISTS(SELECT 1 FROM pg_prepared_statements WHERE name = 'foo') THEN
        PREPARE foo(text,text,text) AS
            SELECT  * 
            FROM    foobar
            WHERE   foo = $1
                AND bar = $2
                OR  baz = $3;
    END IF;
END$$;
EXECUTE foo('foo','bar','baz');

আপনি সর্বদা এই ক্রমে এটি সম্পাদন করতে পারেন (কোয়েরিটি প্রস্তুত না হলে কেবল প্রস্তুত করা হয়), সম্পাদনার পুনরাবৃত্তি করুন এবং শেষ কোয়েরি থেকে ফলাফল পাবেন।

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