it-swarm.asia

لا يملك الأمر Postgres client copy (\ copy) حق الوصول إلى جدول مؤقت؟

أقوم بإنشاء قائمة بأوامر SQL لتصدير بعض البيانات التي يتم تشغيلها في النهاية باستخدام psql -f. تحصل جميع طلبات البحث على نفس المجموعة الفرعية من البيانات ، لذلك اعتقدت أنني سأضع المؤهلات في الاعتبار وأضع قائمة بمعرفات المستخدم المؤهلة في جداول مؤقتة مثل ذلك

create temporary table tmp_export_users as (select id from users where ...)

ثم الرجوع إلى ذلك في أوامري نسخ مثل

\copy (select ... from table where user_id in (select id from tmp_export_users)) TO 'filename.csv' WITH CSV HEADER

هذه كلها في نفس الملف ، واحد في كل سطر ، وتشغيلها - إذا ظهر لي خطأ أن أوامر النسخ لا تستطيع رؤية الجدول المؤقت ، لذلك أعتقد أن أمر نسخة العميل يجب ألا يستخدم بالفعل نفس postgres جلسة كما psql.

هل هذا صحيح؟ هل هناك طريقة لتغيير هذا السلوك؟

8
jkebinger

\copy يمكن استخدام جدول مؤقت.

أولاً قمت باختبار وتأكيد هذا مع الإصدار 9.0 في سطر الأوامر.
ثم قمت بإنشاء ملف باستخدام أمر SQL و psql meta \copy باستخدام عدة جداول مؤقتة. التي عملت بالنسبة لي أيضا.

CREATE TEMP TABLE tmp as SELECT * FROM tbl;
\copy (SELECT * FROM tmp JOIN tbl USING (id)) TO '/var/lib/postgres/test1.csv';

مكالمة:

psql -p5432 mydb -f test.sql

لاحظ الفاصلة المنقوطة النهائية ، وهي اختيارية في نهاية file (تم إنهاؤها ضمنيًا) ، ولكنها مطلوبة بعد أي عبارة SQL أخرى وأيضًا بعد العبارة الأخيرة إذا تم تنفيذها في psql بشكل تفاعلي.

عادةً ، لا يمكن خلط أوامر meta-psql مع SQL على نفس السطر في ملف منفذ لكل psql -f. أقتبس يدوي على psql :

يتوقف تحليل الحجج في نهاية السطر ، أو عند العثور على شرطة مائلة عكسية أخرى غير مقتبسة. يتم أخذ الشرطة المائلة العكسية غير المقتبسة كبداية لأمر تعريف جديد. التسلسل الخاص \\ (شرطتان مائلتان) تشير إلى نهاية الحجج وتستمر في تحليل أوامر SQL ، إن وجدت. بهذه الطريقة يمكن مزج أوامر SQL و psql بحرية على الخط. ولكن على أي حال ، لا يمكن أن تستمر حجج الأمر التلوي بعد نهاية السطر.

تنطبق قواعد مختلفة after\copy، على أية حال. بشكل أساسي ، يقوم psql بالتبديل مرة أخرى إلى وضع SQL تلقائيًا بعد \copy نرى:

لكنك كتبت أن لديك جميع الأوامر على أسطر منفصلة. لذلك لا يمكن أن يكون التفسير في قضيتك.


كل هذا جانبًا ، هل فكرت في استخدام COPY (الأمر SQL ) بدلاً من \copy (the psql meta-command

بالطبع ، يجب أن يكون الملف الهدف محليًا للخادم ليس العميل في هذه الحالة. وتنطبق امتيازات الملف المختلفة. الدليل :

تتم قراءة الملفات المكتوبة في أمر COPY أو كتابتها مباشرةً بواسطة الخادم ، وليس بواسطة تطبيق العميل. لذلك ، يجب أن تكون موجودة في جهاز خادم قاعدة البيانات ، وليس العميل. يجب أن تكون قابلة للوصول إليها وقابلة للقراءة أو الكتابة بواسطة مستخدم PostgreSQL (معرف المستخدم الذي يعمل عليه الخادم) ، وليس العميل.

16
Erwin Brandstetter