PostgreSQL বাইটা কলামে কীভাবে (ফাইল) ডেটা sertোকানো যায়?


37

এই প্রশ্নটি বাইটিয়া ভি। ওয়েড ভি ব্লবস বনাম বড় আকারের বস্তু ইত্যাদির বিষয়ে নয় etc.

আমার কাছে একটি প্রাথমিক কী integerক্ষেত্র এবং একটি byteaক্ষেত্র সমেত একটি টেবিল রয়েছে । আমি byteaক্ষেত্রের মধ্যে তথ্য প্রবেশ করতে চাই । সম্ভবত, এটি যে কোনও একটি PL/ভাষা দ্বারা সম্পন্ন করা যেতে পারে এবং আমি PL/Pythonভবিষ্যতে এটি করার চেষ্টা করতে পারি।

যেহেতু আমি এখনও পরীক্ষা এবং পরীক্ষা নিরীক্ষা করছি, আমি কেবল "স্ট্যান্ডার্ড" এসকিউএল স্টেটমেন্ট ব্যবহার করে কোনও ফাইল (সার্ভারে) থেকে ডেটা sertোকাতে চাই। আমি সচেতন যে সার্ভারে লিখিত অনুমতি সহ কেবল প্রশাসকরা আমার পছন্দ মতো ডেটা toোকাতে সক্ষম হবেন। আমি এই পর্যায়ে সে বিষয়ে উদ্বিগ্ন নই কারণ ব্যবহারকারীরা byteaবর্তমানে ডেটা serোকাবেন না । আমি বিভিন্ন স্ট্যাকএক্সচেঞ্জ সাইট, পোস্টগ্র্যাস এসকিউএল আর্কাইভ এবং ইন্টারনেট সাধারণত অনুসন্ধান করেছিলাম তবে উত্তর খুঁজে পেতে সক্ষম হইনি।

সম্পাদনা: ২০০৮ সালের এই আলোচনাটি বোঝায় যে আমি যা করতে চাই তা সম্ভব নয়। byteaক্ষেত্রগুলি তখন কীভাবে ব্যবহৃত হয়?

সম্পাদনা: ২০০৫ সালের এই একই প্রশ্নটি উত্তরহীন রয়ে গেছে।

মীমাংসিত: বিশদ বিবরণ প্রদান করা এখানে উপর psycopgওয়েবসাইট একটি সমাধান আমি পাইথন লেখা থাকেন ভিত্তি প্রদান করা হয়েছে। এটি byteaব্যবহার করে কলামে বাইনারি ডেটা inোকানোও সম্ভব হতে পারে PL/Python। "বিশুদ্ধ" এসকিউএল ব্যবহার করে এটি সম্ভব কিনা তা আমি জানি না।


1
সাইকোপগ ডক্সের লিঙ্কটি নষ্ট হয়ে গেছে এবং আমার সম্পাদনা প্রত্যাখ্যাত হয়েছে বলে মনে হচ্ছে (!?)। এখানে বর্তমান অবস্থান
আরেহ লাইব বৃষ

@ আরিহেলিবটৌরোগ: ধন্যবাদ আমি সম্পাদনাটি প্রত্যাখ্যান করেছি কারণ এটি আপনার কাছে পরিষ্কার হয়নি যে আপনার পরিবর্তিত পাঠ্যটি একটি হাইপারলিংক। আপনি যদি আবার সম্পাদনা করতে চান তবে আমি এটি অনুমোদন করব।
SabreWolfy

@ অ্যান্ড্রি_এম আপনি কেন মনে করেন যে "এই সম্পাদনাটি পোস্টের মূল উদ্দেশ্য থেকে বিচ্যুত হয়।" (সম্পাদনা
ইনফরমিটিক01

@ অলৌকিক চিহ্ন: কারণ আমি ধারণা পেয়েছি যে প্রস্তাবিত কিছু ট্যাগ অপ্রাসঙ্গিক (ভাল, আসলে একটি মাত্র, blob)। যদি এটি কোনও ভুল হয়ে থাকে তবে আমি আন্তরিকভাবে ক্ষমা চাইছি।
অ্যান্ড্রি এম

@ অ্যান্ড্রি_এম: ম্যানুয়ালটিতে "টাইপিয়া" সম্পর্কে বলা হয়েছে: "এসকিউএল স্ট্যান্ডার্ডটি একটি ভিন্ন বাইনারি স্ট্রিং প্রকারকে সংজ্ঞায়িত করে যার নাম BLOB বা BINARY LARGE OBJECT The সুতরাং আমি মনে করি blobঠিক আছে, সম্ভবত datafileঅপ্রাসঙ্গিক।
चमत्कार 173

উত্তর:


26

সুপারভাইজার হিসাবে:

create or replace function bytea_import(p_path text, p_result out bytea) 
                   language plpgsql as $$
declare
  l_oid oid;
begin
  select lo_import(p_path) into l_oid;
  select lo_get(l_oid) INTO p_result;
  perform lo_unlink(l_oid);
end;$$;

lo_get 9.4 তে প্রবর্তিত হয়েছিল তাই পুরানো সংস্করণগুলির জন্য আপনার প্রয়োজন হবে:

create or replace function bytea_import(p_path text, p_result out bytea) 
                   language plpgsql as $$
declare
  l_oid oid;
  r record;
begin
  p_result := '';
  select lo_import(p_path) into l_oid;
  for r in ( select data 
             from pg_largeobject 
             where loid = l_oid 
             order by pageno ) loop
    p_result = p_result || r.data;
  end loop;
  perform lo_unlink(l_oid);
end;$$;

তারপর:

insert into my_table(bytea_data) select bytea_import('/my/file.name');

বিপরীত প্রক্রিয়া জন্য, আমি চেষ্টা করিনি এই , কিন্তু যদি এটি কাজ করে, lo_export আপনার যা দরকার তা হতে হবে
জ্যাক ডগলাস


15

রানটাইমের ক্ষেত্রে এই সমাধানটি হুবহু দক্ষ নয়, তবে আপনার নিজের শিরোনামগুলির তুলনায় এটি তুচ্ছ সহজ COPY BINARY। তদ্ব্যতীত, এর জন্য বাশের বাইরে কোনও লাইব্রেরি বা স্ক্রিপ্টিং ভাষার প্রয়োজন নেই।

প্রথমে ফাইলটির আকার দ্বিগুণ করে হেক্সডাম্পে ফাইলটি রূপান্তর করুন। xxd -pআমাদের বেশ কাছাকাছি আসে, তবে এটি কিছু বিরক্তিকর নিউলাইনগুলিতে ফেলে দেয় যা আমাদের যত্ন নিতে হবে:

xxd -p /path/file.bin | tr -d '\n' > /path/file.hex

এরপরে পোস্টগ্রিএসকিউএল-তে ডেটাটি খুব বড় textক্ষেত্র হিসাবে আমদানি করুন । এই ধরণের ক্ষেত্রের মান প্রতি এক গিগাবাইট পর্যন্ত থাকে, তাই বেশিরভাগ উদ্দেশ্যে আমাদের ঠিক করা উচিত:

CREATE TABLE hexdump (hex text); COPY hexdump FROM '/path/file.hex';

এখন যেহেতু আমাদের ডেটা কৃত্রিমভাবে বৃহত হেক্স স্ট্রিং, আমরা decodeএটিকে কোনও byteaধরণের জন্য পোস্টগ্র্যাসকিউএল ব্যবহার করি :

CREATE TABLE bindump AS SELECT decode(hex, 'hex') FROM hexdump;

এই সমাধানের ফলাফল হিসাবে ফাইল থেকে characters n অক্ষর মুছে ফেলা হচ্ছে।
সাবারওল্ফি

2
সাবেরওল্ফি: না, তা হয় না। tr -d '\n'Xxd যাও আউটপুট, যা হওয়া ASCII হেক্সাডেসিমেল অক্ষর (0-9 এবং Af) হিসেবে ইনপুটের বাইনারি কন্টেন্ট এনকোড উপর অপারেটিং হয়। এক্সএক্সডি আউটপুটটিকে মানব-পঠনযোগ্য করে তুলতে নিয়মিত বিরতিতে আউটপুট লাইন ফিডে ঘটে তবে এই ক্ষেত্রে আমরা সেগুলি সরাতে চাই। মূল ডেটাতে লাইন ফিডগুলি হেক্স আকারে হবে এবং অকার্যকর থাকবে।
15:30 এ মালামাল

5

Xxd যাও সঙ্গে উত্তর , খুব দ্রুত ছোট ফাইল জন্য চমৎকার এবং,। নীচে আমি ব্যবহার করছি একটি উদাহরণ স্ক্রিপ্ট।

xxd  -p /home/user/myimage.png | tr -d '\n' > /tmp/image.hex
echo "
    -- CREATE TABLE hexdump (hex text);
    DELETE FROM hexdump;
    COPY hexdump FROM '/tmp/image.hex';

    -- CREATE TABLE bindump (binarydump bytea);
    DELETE FROM bindump;

    INSERT INTO bindump (binarydump)  
    (SELECT decode(hex, 'hex') FROM hexdump limit 1);

    UPDATE users 
    SET image= 
    (
        SELECT decode(hex, 'hex') 
        FROM hexdump LIMIT 1
    )  
    WHERE id=15489 ;
    " | psql mydatabase

1

পোস্টগ্রিস কপি বিনারি ফাংশনটি ব্যবহার করুন । এটি ব্যাপকভাবে ওরাকল এর বাহ্যিক টেবিলগুলির সমতুল্য ।


ধন্যবাদ। আপনি যে লিঙ্কটি দিয়েছেন তা নির্দেশ করে যে ডেটা হয় হয় ASCII বা পোস্টগ্রিসএসকিউএল এর বাইনারি সারণী বিন্যাসে। পৃষ্ঠার আরও নীচে, উল্লেখ করা হয়েছে যে বাইনারি টেবিল বিন্যাসটি প্রথমে একটি COPY TO কমান্ড দিয়ে তৈরি হয়েছিল। এই পদ্ধতির কোনওটি কি আমাকে byteaকলামে একটি বাইনারি ফাইল (পিডিএফ, ডকুমেন্ট, স্প্রেডশিট) সন্নিবেশ করার অনুমতি দেবে ?
সাব্রেভল্ফি

কপি বাইনারে পোস্টগ্রিজএসকিউএল ডকুমেন্টেশন ( postgresql.org/docs/8.4/interactive/sql-copy.html ) নির্দেশ করে যে বাইনারি ডেটা tingোকানোর সময় একটি বিশেষ ফাইল শিরোনাম প্রয়োজন। আমার কি এই হেডারটি তৈরি করতে এবং বাইনারি ডেটাতে এটি যুক্ত করার দরকার আছে? এটি কেবল বাইনারি ডেটার একটি স্ট্রিং সংরক্ষণ করার জন্য কিছুটা জটিল বলে মনে হচ্ছে না।
সাব্রেভল্ফি

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