| PSQL(1) | PostgreSQL 18.6 Documentation | PSQL(1) |
نام (NAME)
psql - ترمینال تعاملی PostgreSQL
خلاصه دستور (SYNOPSIS)
psql [option...] [dbname [username]]
توضیحات (DESCRIPTION)
دستور psql یک واسط کاربری متنی (front-end) برای PostgreSQL است. این ابزار به شما امکان میدهد پرسوجوها را بهصورت تعاملی تایپ کرده، آنها را به PostgreSQL ارسال نمایید و نتایج پرسوجو را مشاهده کنید. همچنین، ورودی میتواند از یک فایل یا از آرگومانهای خط فرمان تأمین شود. علاوه بر این، psql تعدادی فرادستور (meta-command) و قابلیتهای گوناگون شبیه به پوسته ارائه میدهد تا نوشتن اسکریپتها و خودکارسازی طیف وسیعی از وظایف تسهیل گردد.
گزینهها (OPTIONS)
-a
--echo-all
-A
--no-align
-b
--echo-errors
-c command
--command=command
command باید یا یک رشته دستور باشد که کاملاً توسط سرور قابل تجزیه است (یعنی شامل هیچکدام از قابلیتهای اختصاصی psql نیست)، یا یک دستور بکاسلش منفرد باشد. بنابراین نمیتوانید دستورات SQL و فرادستورهای psql را درون یک گزینه -c ترکیب کنید. برای دستیابی به این هدف، میتوانید از گزینههای تکراری -c استفاده کرده یا رشته را به psql پایپ کنید؛ برای مثال:
psql -c '\x' -c 'SELECT * FROM foo;'
یا
echo '\x \\ SELECT * FROM foo;' | psql
(\\ فرادستور جداکننده است.)
هر رشته دستور SQL که به -c داده میشود، به عنوان یک درخواست واحد به سرور ارسال میگردد. به همین دلیل، سرور آن را حتی اگر رشته شامل چندین دستور SQL باشد به عنوان یک تراکنش واحد اجرا میکند، مگر اینکه دستورات صریح BEGIN/COMMIT در رشته گنجانده شده باشند تا آن را به چندین تراکنش تقسیم کنند. (برای جزئیات بیشتر درباره نحوه رسیدگی سرور به رشتههای چندپرسوجویی، بخش Section 54.2.2.1 را ببینید.)
اگر مایل نیستید چند دستور در یک تراکنش اجرا شوند، از دستورات تکراری -c استفاده کنید یا چندین دستور را به ورودی استاندارد psql هدایت نمایید؛ چه با استفاده از echo همانطور که در بالا نشان داده شد، یا از طریق یک here-document در پوسته؛ برای مثال:
psql <<EOF \x SELECT * FROM foo; EOF
--csv
-d dbname
--dbname=dbname
-e
--echo-queries
-E
--echo-hidden
--file=filename
اگر filename برابر با - (خط پیوند) باشد، ورودی استاندارد تا رسیدن به نشانگر EOF یا فرادستور \q خوانده میشود. از این قابلیت میتوان برای درآمیختن ورودی تعاملی با ورودی فایلها استفاده کرد. با این حال توجه داشته باشید که در این حالت از Readline استفاده نمیشود (درست مانند حالتی که -n مشخص شده باشد).
استفاده از این گزینه تفاوت ظریفی با نوشتن psql < filename دارد. بهطور کلی هر دو آنچه را که انتظار دارید انجام میدهند، اما استفاده از -f برخی قابلیتهای مفید مانند پیامهای خطا به همراه شماره خطوط را فعال میکند. همچنین احتمال کمی وجود دارد که استفاده از این گزینه سربار راهاندازی را کاهش دهد. از سوی دیگر، حالت استفاده از تغییر مسیر ورودی پوسته (در تئوری) تضمین میکند دقیقاً همان خروجیای حاصل شود که اگر همهچیز را دستی وارد میکردید دریافت میکردید.
-F separator
--field-separator=separator
-h hostname
--host=hostname
-H
--html
-l
--list
هنگامی که از این گزینه استفاده میشود، psql به پایگاه داده postgres متصل خواهد شد، مگر اینکه پایگاه داده متفاوتی در خط فرمان مشخص شده باشد (گزینهٔ -d یا آرگومان غیرگزینهای، احتمالاً از طریق یک مدخل سرویس، اما نه از طریق متغیر محیطی).
-L filename
--log-file=filename
-n
--no-readline
-o filename
--output=filename
-p port
--port=port
-P assignment
--pset=assignment
-q
--quiet
-R separator
--record-separator=separator
-s
--single-step
-S
--single-line
نکته
این حالت برای کسانی ارائه شده است که بر استفاده از آن اصرار دارند، اما لزوماً استفاده از آن به شما توصیه نمیشود. بهویژه، اگر SQL و فرادستورها را در یک خط با هم ترکیب کنید، ترتیب اجرا ممکن است برای کاربر کمتجربه همیشه واضح نباشد.
-t
--tuples-only
-T table_options
--table-attr=table_options
--username=username
-v assignment
--set=assignment
--variable=assignment
-V
--version
-w
--no-password
توجه داشته باشید که این گزینه برای کل نشست فعال خواهد ماند، بنابراین بر استفاده از فرامان \connect و همچنین تلاش اولیه برای برقراری اتصال تأثیر میگذارد.
-W
--password
اگر کارگزار به احراز هویت با گذرواژه نیاز داشته باشد و گذرواژهای از منابع دیگر مانند فایل .pgpass در دسترس نباشد، psql در هر حال اعلان دریافت گذرواژه را نمایش خواهد داد. با این حال، psql یک تلاش برای اتصال را صرفاً جهت پی بردن به اینکه کارگزار به گذرواژه نیاز دارد تلف میکند. در برخی موارد، نوشتن -W ارزشش را دارد تا از تلاش اضافه برای برقراری اتصال اجتناب شود.
توجه داشته باشید که این گزینه برای کل نشست فعال خواهد ماند، بنابراین بر استفاده از فرامان \connect و همچنین تلاش اولیه برای اتصال تأثیر میگذارد.
-x
--expanded
-X
--no-psqlrc
-z
--field-separator-zero
-0
--record-separator-zero
-1
--single-transaction
اگر خود دستورها حاوی BEGIN، COMMIT یا ROLLBACK باشند، این گزینه اثر مورد نظر را نخواهد داشت. همچنین اگر یک دستور منفرد نتواند درون یک بلوک تراکنش اجرا شود، تعیین این گزینه باعث شکست کل تراکنش خواهد شد.
-?
--help[=topic]
psql در صورتی که به طور عادی پایان یابد مقدار 0 را به شل بازمیگرداند؛ در صورت بروز خطای مهلک داخلی (مانند اتمام حافظه یا پیدا نشدن فایل) مقدار 1؛ در صورتی که اتصال به سرور قطع شود و نشست به صورت تعاملی نباشد مقدار 2؛ و در صورتی که خطایی در یک اسکریپت رخ دهد و متغیر ON_ERROR_STOP تنظیم شده باشد مقدار 3 را بازمیگرداند.
نحوه استفاده (USAGE)
اتصال به پایگاه داده (Connecting to a Database)
psql یک برنامه کلاینت معمولی PostgreSQL است. برای اتصال به یک پایگاه داده باید نام پایگاه داده هدف، نام میزبان و شماره پورت سرور، و نام کاربری پایگاه دادهای که میخواهید با آن متصل شوید را بدانید. میتوان این پارامترها را از طریق گزینههای خط فرمان، یعنی به ترتیب -d، -h، -p و -U به psql اعلام کرد. اگر آرگومانی پیدا شود که متعلق به هیچ گزینهای نباشد، به عنوان نام پایگاه داده (یا در صورتی که نام پایگاه داده از قبل مشخص شده باشد، به عنوان نام کاربر پایگاه داده) تفسیر خواهد شد. همه این گزینهها اجباری نیستند؛ مقادیر پیشفرض مفیدی وجود دارند. اگر نام میزبان را نادیده بگیرید، psql از طریق یک سوکت دامنه یونیکس (Unix-domain socket) به سروری روی میزبان محلی، یا از طریق TCP/IP به localhost در ویندوز متصل خواهد شد. شماره پورت پیشفرض در زمان کامپایل تعیین میشود. از آنجا که سرور پایگاه داده از همان پیشفرض استفاده میکند، در بیشتر موارد نیازی به مشخص کردن پورت نخواهید داشت. نام کاربر پیشفرض پایگاه داده، همان نام کاربری سیستمعامل شما است. پس از تعیین نام کاربر پایگاه داده، از آن به عنوان نام پایگاه داده پیشفرض استفاده میشود. توجه داشته باشید که نمیتوانید با هر نام کاربری پایگاه داده به هر پایگاه دادهای متصل شوید. مدیر پایگاه داده شما باید شما را از دسترسیهایتان مطلع کرده باشد.
هنگامی که مقادیر پیشفرض کاملاً مناسب نیستند، میتوانید با تنظیم متغیرهای محیطی PGDATABASE، PGHOST، PGPORT و/یا PGUSER به مقادیر مناسب، از تایپ مکرر جلوگیری کنید. (برای متغیرهای محیطی بیشتر، بخش 32.15 را ببینید.) همچنین داشتن یک فایل ~/.pgpass برای جلوگیری از نیاز مداوم به تایپ گذرواژهها سودمند است. برای اطلاعات بیشتر بخش 32.16 را ببینید.
یک راه جایگزین برای مشخص کردن پارامترهای اتصال، استفاده از یک رشته conninfo یا یک URI است که به جای نام پایگاه داده به کار میرود. این سازوکار کنترل بسیار گستردهای بر اتصال به شما میدهد. برای مثال:
$ psql "service=myservice sslmode=require" $ psql postgresql://dbmaster:5433/mydb?sslmode=require
به این روش همچنین میتوانید همانطور که در بخش 32.18 شرح داده شده است، از LDAP برای جستجوی پارامترهای اتصال استفاده کنید. برای اطلاعات بیشتر درباره تمام گزینههای اتصال موجود، بخش 32.1.2 را ببینید.
اگر اتصال به هر دلیلی برقرار نشود (مانند مجوزهای ناکافی، اجرا نشدن سرور روی میزبان مورد نظر و غیره)، psql یک خطا را برمیگرداند و خاتمه مییابد.
اگر هر دو ورودی استاندارد و خروجی استاندارد یک ترمینال باشند، psql کدگذاری کلاینت را روی “auto” تنظیم میکند، که کدگذاری کلاینت مناسب را بر اساس تنظیمات محلی (متغیر محیطی LC_CTYPE در سیستمهای یونیکس) تشخیص میدهد. اگر این مورد مطابق انتظار کار نکرد، میتوان کدگذاری کلاینت را با استفاده از متغیر محیطی PGCLIENTENCODING لغو و بازنویسی کرد.
ورود دستورهای SQL (Entering SQL Commands)
در حالت عادی، psql یک اعلان (prompt) همراه با نام پایگاه دادهای که psql در حال حاضر به آن متصل است، و در ادامه رشته => ارائه میدهد. برای مثال:
$ psql testdb psql (18.6) Type "help" for help. testdb=>
در خط اعلان، کاربر میتواند دستورهای SQL را وارد کند. به طور معمول، خطوط ورودی زمانی به سرور ارسال میشوند که یک نقطه-ویرگول پایاندهنده فرمان وارد شود. پایان خط باعث اتمام فرمان نمیشود. بنابراین میتوان دستورها را برای وضوح بیشتر در چندین خط توزیع کرد. اگر فرمان ارسال شده و بدون خطا اجرا شود، نتایج فرمان بر روی صفحه نمایش داده میشوند.
اگر کاربران غیرقابلاعتماد به پایگاه دادهای دسترسی دارند که از الگوی استفاده امن از شِما (secure schema usage pattern) پیروی نکرده است، نشست خود را با حذف شِماهای با قابلیت نوشتن همگانی از search_path آغاز کنید. میتوان options=-csearch_path= را به رشته اتصال اضافه کرد یا دستور SELECT pg_catalog.set_config('search_path', '', false) را پیش از سایر دستورهای SQL اجرا نمود. این نکته مختص psql نیست؛ بلکه در مورد هر رابطی برای اجرای دستورهای دلخواه SQL صدق میکند.
هر زمان که فرمانی اجرا شود، psql همچنین رویدادهای اعلان ناهمگام (asynchronous notification events) تولید شده توسط LISTEN و NOTIFY را بررسی میکند.
در حالی که کامنتهای بلوکی سبک C برای پردازش و حذف به سرور ارسال میشوند، کامنتهای استاندارد SQL توسط psql حذف میگردند.
متادستورها (Meta-Commands)
هر چیزی که در psql وارد کنید و با یک بکاسلش بدون علامت نقلقول آغاز شود، یک متادستور psql است که توسط خود psql پردازش میشود. این دستورها psql را برای امور مدیریتی یا اسکریپتنویسی کاربردیتر میکنند. متادستورها اغلب دستورهای اسلش یا بکاسلش نامیده میشوند.
قالب یک دستور psql عبارت است از بکاسلش، که بلافاصله با فعل فرمان، و سپس هرگونه آرگومان دنبال میشود. آرگومانها با هر تعداد نویسه فاصله خالی از فعل فرمان و از یکدیگر جدا میشوند.
برای گنجاندن فاصله خالی در یک آرگومان میتوانید آن را با نقلقول تکی محصور کنید. برای گنجاندن یک نقلقول تکی در یک آرگومان، دو نقلقول تکی متوالی درون متن محصور با نقلقول تکی بنویسید. هر آنچه درون نقلقولهای تکی قرار دارد علاوه بر این مشمول جایگزینیهای سبک C برای \n (خط جدید)، \t (تب)، \b (پسبر)، \r (بازگشت به ابتدای سطر)، \f (برگهشمار)، \digits (هشتهشتی)، و \xdigits (شانزدهشانزدهی) میشود. یک بکاسلش قبل از هر نویسه دیگر در متن محصور با نقلقول تکی، آن نویسه را، هر چه که باشد، نقلقول (بیاثر) میکند.
اگر یک دونقطه بدون علامت نقلقول (:) همراه با نام یک متغیر psql درون یک آرگومان ظاهر شود، همانطور که در بخش درج متغیرها در SQL (SQL Interpolation) در زیر توضیح داده شده، با مقدار آن متغیر جایگزین میشود. قالبهای :'variable_name' و :"variable_name" که در آنجا شرح داده شدهاند نیز عمل میکنند. نحو :{?variable_name} امکان بررسی تعریف شدن یا نشدن یک متغیر را فراهم میکند. این عبارت با TRUE یا FALSE جایگزین میشود. فرار دادن (escape) دونقطه با یک بکاسلش، آن را از جایگزینی محافظت میکند.
درون یک آرگومان، متنی که در بکتیک (`) محصور شده است، به عنوان یک خط فرمان در نظر گرفته میشود که به شل ارسال میگردد. خروجی فرمان (با حذف هرگونه نویسه خط جدید در انتهای آن) جایگزین متن درون بکتیک میشود. درون متنی که در بکتیک محصور است، هیچ نقلقول ویژه یا پردازش دیگری رخ نمیدهد، به جز اینکه موارد :variable_name که در آنها variable_name یک نام متغیر psql است با مقدار متغیر جایگزین میشوند. همچنین، موارد :'variable_name' با مقدار متغیر جایگزین میشوند که به شکل مناسبی نقلقول شده تا به یک آرگومان واحد در فرمان شل تبدیل شود. (شکل دوم تقریباً همیشه ترجیح داده میشود، مگر اینکه کاملاً مطمئن باشید چه چیزی در متغیر قرار دارد.) به دلیل اینکه نویسههای بازگشت به ابتدای سطر (carriage return) و سطر جدید (line feed) در همه پلتفرمها نمیتوانند به شکل امن نقلقول شوند، قالب :'variable_name' در صورت ظاهر شدن چنین نویسههایی در مقدار، یک پیام خطا چاپ میکند و مقدار متغیر را جایگزین نمینماید.
برخی از دستورها یک شناسه SQL (مانند نام جدول) را به عنوان آرگومان دریافت میکنند. این آرگومانها از قواعد نحو SQL پیروی میکنند: حروف بدون نقلقول به حروف کوچک تبدیل میشوند، در حالی که نقلقول دوگانه (") حروف را از تبدیل بزرگ/کوچک محافظت میکند و امکان گنجاندن فاصله خالی را در شناسه فراهم میسازد. درون نقلقول دوگانه، دو نقلقول دوگانه جفتشده به یک نقلقول دوگانه منفرد در نام نهایی تقلیل مییابند. برای مثال، FOO"BAR"BAZ به صورت fooBARbaz تفسیر میشود، و "A weird"" name" تبدیل به A weird" name میگردد.
تجزیه آرگومانها در انتهای خط، یا هنگامی که بکاسلش بدون نقلقول دیگری یافت شود، متوقف میشود. یک بکاسلش بدون نقلقول به عنوان شروع یک متادستور جدید تلقی میشود. دنباله ویژه \\ (دو بکاسلش) پایان آرگومانها را نشان میدهد و به تجزیه دستورهای SQL (در صورت وجود) ادامه میدهد. به این ترتیب دستورهای SQL و psql را میتوان آزادانه در یک خط ترکیب کرد. اما در هر صورت، آرگومانهای یک متادستور نمیتوانند فراتر از انتهای خط ادامه پیدا کنند.
بسیاری از متادستورها بر روی بافر پرسوجوی جاری (current query buffer) عمل میکنند. این صرفاً بافری است که هر متن دستور SQL را که تایپ شده اما هنوز برای اجرا به سرور ارسال نشده است، نگهداری میکند. این شامل خطوط ورودی قبلی و همچنین هر متنی است که پیش از متادستور در همان خط قرار دارد.
بسیاری از متادستورها همچنین اجازه میدهند که x به عنوان یک گزینه به آنها اضافه شود. این باعث میشود که نتایج در حالت گسترده (expanded mode) نمایش داده شوند، درست مانند اینکه از \x یا \pset expanded استفاده شده باشد..PP متادستورهای زیر تعریف شدهاند:
\a
\bind [ parameter ] ...
مثال:
INSERT INTO tbl1 VALUES ($1, $2) \bind 'first value' 'second value' \g
این دستور علاوه بر \g، برای سایر دستورهای اجرای پرسوجو مانند \gx و \gset نیز کار میکند.
این دستور بر خلاف عملکرد عادی psql که از پروتکل پرسوجوی ساده استفاده میکند، باعث بهکارگیری پروتکل پرسوجوی گسترشیافته (ببینید: بخش 54.1.2) میشود. بنابراین این دستور میتواند برای آزمایش پروتکل پرسوجوی گسترشیافته از طریق psql مفید باشد. (پروتکل پرسوجوی گسترشیافته حتی در صورتی که پرسوجو هیچ پارامتری نداشته باشد و این دستور صفر پارامتر تعیین کرده باشد نیز استفاده میشود.) این دستور تنها بر پرسوجوی بعدی که اجرا میشود تأثیر میگذارد؛ تمام پرسوجوهای بعدی بهطور پیشفرض از پروتکل پرسوجوی ساده استفاده خواهند کرد.
\bind_named statement_name [ parameter ] ...
مثال:
INSERT INTO tbls1 VALUES ($1, $2) \parse stmt1 \bind_named stmt1 'first value' 'second value' \g
این دستور بر خلاف عملکرد عادی psql که از پروتکل پرسوجوی ساده استفاده میکند، باعث بهکارگیری پروتکل پرسوجوی گسترشیافته (ببینید: بخش 54.1.2) میشود. بنابراین این دستور میتواند برای آزمایش پروتکل پرسوجوی گسترشیافته از طریق psql مفید باشد.
\c یا \connect [ -reuse-previous=on|off ] [ dbname [ username ] [ host ] [ port ] | conninfo ]
تعیین هر یک از dbname، username، host یا port به صورت - معادل با حذف آن پارامتر است.
اتصال جدید میتواند پارامترهای اتصال را از اتصال قبلی مجدداً استفاده کند؛ نهتنها نام پایگاهداده، کاربر، میزبان، و درگاه، بلکه سایر تنظیمات نظیر sslmode. بهطور پیشفرض، پارامترها در نحو موضعی مجدداً استفاده میشوند، اما هنگام ارائهٔ رشتهٔ conninfo خیر. ارسال اولین آرگومان به صورت -reuse-previous=on یا -reuse-previous=off این حالت پیشفرض را لغو میکند. اگر پارامترها مجدداً استفاده شوند، هر پارامتری که بهطور صریح به عنوان یک پارامتر موضعی یا در رشتهٔ conninfo مشخص نشده باشد، از پارامترهای اتصال موجود گرفته میشود. یک استثنا این است که اگر تنظیم host از مقدار قبلی خود با استفاده از نحو موضعی تغییر کند، هرگونه تنظیم hostaddr موجود در پارامترهای اتصال کنونی حذف میشود. همچنین، هر گذرواژهای که برای اتصال قبلی استفاده شده است، تنها در صورتی مجدداً استفاده خواهد شد که تنظیمات کاربر، میزبان، و درگاه تغییر نکرده باشند. هنگامی که دستور نه پارامتری را مشخص کند و نه مجدداً استفاده نماید، مقدار پیشفرض libpq بهکار میرود.
اگر اتصال جدید با موفقیت برقرار شود، اتصال قبلی بسته میشود. اگر تلاش برای اتصال با شکست مواجه شود (نام کاربری اشتباه، رد دسترسی، و غیره)، در صورتی که psql در حالت تعاملی باشد، اتصال قبلی حفظ خواهد شد. اما هنگام اجرای یک اسکریپت غیرتعاملی، اتصال قدیمی بسته شده و یک خطا گزارش میشود. این ممکن است به پایان یافتن اسکریپت منجر بشود یا نشود؛ اگر نشود، تمام دستورهای دسترسی به پایگاهداده تا زمانی که دستور \connect دیگری با موفقیت اجرا شود با شکست مواجه خواهند شد. این تمایز از یک سو برای راحتی کاربر در برابر اشتباهات تایپی و از سوی دیگر به عنوان یک سازوکار ایمنی انتخاب شده تا اسکریپتها بهطور تصادفی روی پایگاهدادهٔ اشتباه عمل نکنند. توجه داشته باشید که هر زمان دستور \connect تلاش میکند پارامترها را مجدداً استفاده کند، مقادیر بازاستفادهشده متعلق به آخرین اتصال موفق هستند، نه تلاشهای ناموفقی که پس از آن صورت گرفتهاند. با این حال، در صورت شکست یک \connect غیرتعاملی، هیچ پارامتری اجازهٔ استفادهٔ مجدد بعدی را ندارد، چرا که اسکریپت احتمالاً انتظار بازاستفاده از مقادیر حاصل از \connect شکستخورده را خواهد داشت.
مثالها:
=> \c mydb myuser host.dom 6432 => \c service=foo => \c "host=localhost port=5432 dbname=mydb connect_timeout=10 sslmode=disable" => \c -reuse-previous=on sslmode=require -- changes only sslmode => \c postgresql://tom@localhost/mydb?application_name=myapp
\C [ title ]
\cd [ directory ]
نکته
برای چاپ دایرکتوری کاری فعلی خود، از \! pwd استفاده کنید.
\close_prepared prepared_statement_name
مثال:
SELECT $1 \parse stmt1 \close_prepared stmt1
این دستور بر خلاف عملکرد عادی psql که از پروتکل پرسوجوی ساده استفاده میکند، باعث بهکارگیری پروتکل پرسوجوی گسترشیافته میشود. بنابراین این دستور میتواند برای آزمایش پروتکل پرسوجوی گسترشیافته از طریق psql مفید باشد.
\conninfo
توجه داشته باشید که فیلد Client User کاربر را در زمان برقراری اتصال نشان میدهد، در حالی که فیلد Superuser مشخص میکند که آیا کاربر فعلی (در بافت اجرایی جاری) از امتیازات مدیر سیستم (superuser) برخوردار است یا خیر. این کاربران معمولاً یکسان هستند، اما میتوانند متفاوت باشند، برای مثال اگر کاربر فعلی با دستور SET ROLE تغییر کرده باشد.
\copy { table [ ( column_list ) ] } from {
'filename' | program 'command' | stdin | pstdin } [ [ with ] (
option [, ...] ) ] [ where condition ]
\copy { table [ ( column_list ) ] | ( query ) } to {
'filename' | program 'command' | stdout | pstdout } [ [ with ]
( option [, ...] ) ]
هنگامی که program مشخص شده باشد، command توسط psql اجرا میشود و دادههای ارسالشده از یا به command میان سرور و کلاینت هدایت میشوند. مجدداً، امتیازات اجرا متعلق به کاربر محلی است نه سرور، و نیازی به امتیازات مدیر سیستم در SQL نیست.
برای \copy ... from stdin، سطرهای داده از همان منبعی که دستور را صادر کرده خوانده میشوند، و تا زمانی که خطی فقط شامل \. خوانده شود یا جریان داده به EOF برسد ادامه مییابد. این گزینه برای پر کردن جدولها بهصورت درخط در یک فایل اسکریپت SQL مفید است. برای \copy ... to stdout، خروجی به همان جایی ارسال میشود که خروجی دستورهای psql فرستاده میشود، و وضعیت دستور COPY count چاپ نمیشود (زیرا ممکن است با یک سطر داده اشتباه گرفته شود). برای خواندن/نوشتن در ورودی یا خروجی استاندارد psql، بدون در نظر گرفتن منبع دستور جاری یا گزینهٔ \o، عبارت from pstdin یا to pstdout را بنویسید.
نحو این دستور مشابه دستور COPY در SQL است. تمام گزینهها به غیر از مبدأ/مقصد داده، همانند مواردی هستند که برای COPY مشخص شدهاند. به همین دلیل، قواعد تجزیهٔ نحوی ویژهای بر متادستور \copy اعمال میشود. برخلاف اغلب متادستورهای دیگر، کل باقیماندهٔ خط همیشه به عنوان آرگومانهای \copy در نظر گرفته میشود، و نه جایگذاری متغیر و نه بسط بکتیک در آرگومانها انجام نمیشود.
نکته
روش دیگر برای دستیابی به همان نتیجهٔ \copy ... to، استفاده از دستور SQL بهصورت COPY ... TO STDOUT و پایان دادن به آن با \g filename یا \g |program است. برخلاف \copy، این روش به دستور امکان میدهد که در چند خط گسترده شود؛ همچنین میتوان از جایگذاری متغیرها و بسط بکتیک استفاده کرد.
نکته
این عملیاتها به اندازهٔ دستور COPY در SQL با مبدأ یا مقصد دادهٔ فایلی یا برنامهای کارآمد نیستند، چرا که تمام دادهها باید از طریق اتصال کلاینت/سرور عبور کنند. برای حجم زیادی از دادهها، ممکن است دستور SQL ارجحیت داشته باشد.
\crosstabview [ colV [ colH [ colD [ sortcolH ] ] ] ]
مشخصات هر ستون میتواند یک شماره ستون (شروع از ۱) یا یک نام ستون باشد. قواعد معمول SQL برای تبدیل حروف بزرگ و کوچک و استفاده از علامت نقلقول در نام ستونها اعمال میشود. در صورت حذف، colV به عنوان ستون ۱ و colH به عنوان ستون ۲ در نظر گرفته میشود. colH باید با colV متفاوت باشد. اگر colD مشخص نشده باشد، باید دقیقاً سه ستون در نتیجه پرسمان وجود داشته باشد، و ستونی که نه colV است و نه colH، به عنوان colD در نظر گرفته میشود.
سرستون عمودی که در سمت چپترین ستون نمایش داده میشود، شامل مقادیر موجود در ستون colV با همان ترتیب موجود در نتایج پرسمان، اما با حذف موارد تکراری است.
سرستون افقی که در سطر اول نمایش داده میشود، شامل مقادیر موجود در ستون colH با حذف موارد تکراری است. بهطور پیشفرض، این مقادیر با همان ترتیب موجود در نتایج پرسمان ظاهر میشوند. اما اگر آرگومان اختیاری sortcolH داده شود، ستونی را مشخص میکند که مقادیر آن باید اعداد صحیح باشند و مقادیر colH در سرستون افقی، مرتبشده بر اساس مقادیر متناظر sortcolH ظاهر خواهند شد.
درون جدول متقاطع، برای هر مقدار متمایز x از colH و هر مقدار متمایز y از colV، خانهای که در تقاطع (x,y) قرار دارد حاوی مقدار ستون colD در سطر نتیجه پرسمان است که در آن مقدار colH برابر با x و مقدار colV برابر با y است. اگر چنین سطری وجود نداشته باشد، خانه خالی میماند. اگر چندین سطر اینچنینی وجود داشته باشد، یک خطا گزارش میشود.
\d[Sx+] [ pattern ]
برای برخی از انواع رابطهها، \d اطلاعات بیشتری را برای هر ستون نمایش میدهد: مقادیر ستون برای دنبالهها، عبارتهای ایندکسشده برای ایندکسها، و گزینههای foreign data wrapper برای جدولهای خارجی.
شکل دستوری \d+ مشابه است، با این تفاوت که اطلاعات بیشتری نمایش داده میشود: هرگونه یادداشت (comment) مرتبط با ستونهای جدول نمایش داده میشود، همچنین حضور OIDها در جدول، تعریف view در صورتی که رابطه یک view باشد، تنظیمات غیرپیشفرض replica identity و در صورتی که رابطه دارای روش دسترسی باشد، نام access method نمایش داده میشود.
بهطور پیشفرض، فقط اشیاء ایجادشده توسط کاربر نمایش داده میشوند؛ برای گنجاندن اشیاء سیستمی، یک الگو یا اصلاحکننده S را ارائه دهید.
یادداشت
اگر \d بدون آرگومان pattern استفاده شود، معادل \dtvmsE خواهد بود که فهرستی از تمام جدولها، viewها، viewهای مادیشده، دنبالهها و جدولهای خارجی قابل مشاهده را نمایش میدهد. این فقط یک قابلیت برای راحتی کار است.
مانند بسیاری از دستورهای دیگر، اگر x به انتهای نام دستور اضافه شود، نتایج در حالت گسترده (expanded mode) نمایش داده میشوند، اما توجه داشته باشید که این ویژگی تنها زمانی اعمال میشود که \d بدون آرگومان pattern استفاده شود، و اصلاحکننده x نمیتواند بلافاصله بعد از \d بیاید (زیرا \dx دستور متفاوتی است)؛ اصلاحکننده x تنها میتواند پس از اصلاحکننده S یا + قرار گیرد. برای مثال، \d+x معادل \dtvmsE+x است و فهرستی از تمام رابطهها را در حالت گسترده نمایش خواهد داد.
\da[Sx] [ pattern ]
\dA[x+] [ pattern ]
\dAc[x+] [access-method-pattern [input-type-pattern]]
\dAf[x+] [access-method-pattern [input-type-pattern]]
\dAo[x+] [access-method-pattern [operator-family-pattern]]
\db[x+] [ pattern ]
\dc[Sx+] [ pattern ]
\dconfig[x+] [ pattern ]
\dC[x+] [ pattern ]
\dd[Sx] [ pattern ]
\dd توضیحات مربوط به اشیای منطبق با pattern، یا در صورت عدم ارائه آرگومان، اشیای قابل مشاهده از نوع مناسب را نمایش میدهد. اما در هر دو حالت، تنها اشیایی که دارای توضیحات هستند فهرست میشوند. بهطور پیشفرض، تنها اشیای ایجادشده توسط کاربر نشان داده میشوند؛ برای گنجاندن اشیای سیستمی، یک الگو یا اصلاحکنندهٔ S را ارائه دهید. اگر x به نام دستور افزوده شود، نتایج در حالت گسترده نمایش داده میشوند.
توضیحات اشیاء را میتوان با دستور SQL COMMENT ایجاد کرد.
\dD[Sx+] [ pattern ]
\ddp[x] [ pattern ]
دستور ALTER DEFAULT PRIVILEGES برای تنظیم مجوزهای دسترسی پیشفرض به کار میرود. مفهوم نحوهٔ نمایش مجوزها در بخش 5.8 توضیح داده شده است.
\dE[Sx+] [ pattern ]
\di[Sx+] [ pattern ]
\dm[Sx+] [ pattern ]
\ds[Sx+] [ pattern ]
\dt[Sx+] [ pattern ]
\dv[Sx+] [ pattern ]
\des[x+] [ pattern ]
\det[x+] [ pattern ]
\deu[x+] [ pattern ]
احتیاط
\deu+ ممکن است نام کاربری و گذرواژهٔ کاربر دوردست را نیز نمایش دهد، بنابراین باید احتیاط شود تا آنها فاش نشوند.
\dew[x+] [ pattern ]
\dF[x+] [ pattern ]
\dFd[x+] [ pattern ]
\dFp[x+] [ pattern ]
\dFt[x+] [ pattern ]
\dg[Sx+] [ pattern ]
\dl[x+]
\dL[Sx+] [ pattern ]
\dn[Sx+] [ pattern ]
\do[Sx+] [ pattern [ arg_pattern [ arg_pattern ] ] ]
\dO[Sx+] [ pattern ]
\dp[Sx] [ pattern ]
دستورهای GRANT و REVOKE برای تعیین امتیازات دسترسی استفاده میشوند. معنای نمایش امتیازات در بخش 5.8 توضیح داده شده است.
\dP[itnx+] [ pattern ]
اگر تغییردهندهٔ n (“nested”) استفاده شود، یا یک الگو مشخص شده باشد، آنگاه رابطههای افرازبندیشده غیرریشه گنجانده میشوند، و ستونی نمایش داده میشود که والد هر رابطهٔ افرازبندیشده را نشان میدهد.
اگر x به نام دستور ضمیمه شود، نتایج در حالت گسترده نمایش داده میشوند. اگر + به نام دستور ضمیمه شود، مجموع اندازهٔ پارتیشنهای هر رابطه نیز همراه با توضیحات رابطه نمایش داده میشود. اگر n با + ترکیب شود، دو اندازه نشان داده میشود: یکی شامل اندازه کل پارتیشنهای برگ مستقیماً متصل، و دیگری اندازه کل همه پارتیشنها از جمله زیرپارتیشنهای غیرمستقیم متصل را نمایش میدهد. \drds[x] [ role-pattern [ database-pattern ] ]
دستورهای ALTER ROLE و ALTER DATABASE برای تعریف تنظیمات پیکربندی بهازای هر نقش و بهازای هر پایگاهداده به کار میروند.
\drg[Sx] [ pattern ]
بهطور پیشفرض، فقط اعطاها به نقشهای ایجادشده توسط کاربر نشان داده میشوند؛ تغییردهندهٔ S را برای گنجاندن نقشهای سیستمی اضافه کنید. اگر pattern مشخص شود، تنها اعطاها به نقشهایی که نامشان با الگو مطابقت دارد فهرست میشوند. اگر x به انتهای نام دستور اضافه شود، نتایج در حالت گسترده نمایش داده میشوند.
\dRp[x+] [ pattern ]
\dRs[x+] [ pattern ]
\dT[Sx+] [ pattern ]
\du[Sx+] [ pattern ]
\dx[x+] [ pattern ]
\dX[x] [ pattern ]
وضعیت هر نوع از آمارهای گسترشیافته در ستونی به نام همان نوع آمار (مانند Ndistinct) نشان داده میشود. مقدار defined به این معنی است که هنگام ایجاد آمار درخواست شده بوده است، و مقدار NULL به این معنی است که درخواست نشده بوده است. اگر مایلید بدانید که آیا ANALYZE اجرا شده و آمارها در دسترس برنامهریز (planner) هستند یا خیر، میتوانید از pg_stats_ext استفاده کنید.
\dy[x+] [ pattern ]
\e یا \edit [ filename ] [ line_number ]
اگر فایلی یا پرسمان قبلی را ویرایش کنید، و بدون تغییر دادن فایل از ویرایشگر خارج شوید، بافر پرسمان پاک میشود. در غیر این صورت، محتوای جدید بافر پرسمان طبق قواعد معمول psql و با رفتار با کل بافر به عنوان یک خط واحد، مجدداً تجزیه میشود. هر پرسمانِ کامل بلافاصله اجرا میشود؛ به این معنی که اگر بافر پرسمان حاوی یک نقطه ویرگول (semicolon) باشد یا با آن پایان یابد، همه چیز تا آن نقطه اجرا شده و از بافر پرسمان حذف میشود. هر آنچه در بافر پرسمان باقی بماند دوباره نمایش داده میشود. نقطه ویرگول یا \g را برای ارسال آن تایپ کنید، یا \r را برای لغو آن از طریق پاک کردن بافر پرسمان وارد نمایید.
رفتار با بافر به عنوان یک تکخط، عمدتاً بر متادستورها تأثیر میگذارد: هر آنچه پس از یک متادستور در بافر قرار گیرد به عنوان آرگومان(های) آن متادستور در نظر گرفته میشود، حتی اگر در چندین خط گسترده شده باشد. (بنابراین نمیتوانید از این طریق اسکریپتهایی با متادستور بسازید. برای این کار از \i استفاده کنید.)
اگر شمارهٔ خط مشخص شده باشد، psql مکاننما را روی خط مشخصشده از فایل یا بافر پرسمان قرار میدهد. توجه داشته باشید که اگر یک تکآرگومانِ کاملاً عددی داده شود، psql آن را شمارهٔ خط فرض میکند، نه نام فایل.
نکته
برای نحوهٔ پیکربندی و سفارشیسازی ویرایشگر خود، بخش Environment در ادامه را ببینید.
\echo text [ ... ]
=> \echo `date` Tue Oct 26 21:40:57 CEST 1999
اگر نخستین آرگومان یک -n بدون نقلقول باشد، خط جدید انتهایی نوشته نمیشود (و آرگومان نخست نیز نوشته نمیشود).
نکته
اگر از دستور \o برای تغییر مسیر خروجی پرسمان خود استفاده میکنید، ممکن است بخواهید به جای این دستور از \qecho استفاده کنید. همچنین \warn را ببینید.
تابع هدف را میتوان تنها با نام، یا با نام و آرگومانها، برای نمونه foo(integer, text) مشخص کرد. اگر بیش از یک تابع با نام یکسان وجود داشته باشد، نوع آرگومانها باید ذکر شود.
اگر هیچ تابعی مشخص نشود، یک قالب خالی CREATE FUNCTION برای ویرایش ارائه میشود.
اگر شمارهٔ خط تعیین شده باشد، psql مکاننما را در خط مشخصشده از بدنهٔ تابع قرار میدهد. (توجه داشته باشید که بدنهٔ تابع معمولاً در خط اول فایل آغاز نمیشود.)
برخلاف اکثر فرادستورهای دیگر، تمام دنبالهٔ خط همواره به عنوان آرگومان(های) \ef در نظر گرفته میشود و هیچگونه درونیابی متغیر یا بسط نقلقول معکوس روی آرگومانها انجام نمیشود.
نکته
برای چگونگی پیکربندی و سفارشیسازی ویرایشگر خود، بخش «محیط» را در ادامه ببینید.
\encoding [ encoding ]
\errverbose
\ev [ view_name [ line_number ] ]
اگر هیچ نمایی مشخص نشود، یک قالب خالی CREATE VIEW برای ویرایش ارائه میشود.
اگر شمارهٔ خط مشخص شده باشد، psql مکاننما را در خط مشخصشده از تعریف نما قرار میدهد.
برخلاف بیشتر فرادستورهای دیگر، تمام دنبالهٔ خط همواره به عنوان آرگومان(های) \ev در نظر گرفته میشود و هیچگونه درونیابی متغیر یا بسط نقلقول معکوس روی آرگومانها انجام نمیشود.
\f [ string ]
\g [ (option=value [...]) ] [ filename ]
\g [ (option=value [...]) ] [ |command ]
اگر پس از \g پرانتز قرار گیرد، نشاندهندهٔ فهرستی از بندهای گزینههای قالببندی option=value است که با فاصله از هم جدا شدهاند؛ این بندها همانند دستورهای \pset option value تفسیر میشوند، اما تنها برای مدتزمان اجرای این پرسوجو معتبر خواهند بود. در این فهرست، وجود فاصله در اطراف علامتهای = مجاز نیست، اما بین بندهای گزینهها الزامی است. اگر =value حذف شود، option نامبرده به همان شیوهای تغییر میکند که در دستور \pset option بدون value صریح عمل میشود.
اگر آرگومان filename یا |command داده شود، خروجی پرسوجو به جای نمایش معمول، در فایل مشخصشده نوشته میشود یا به دستور شل دادهشده هدایت (pipe) میگردد. نوشتن در فایل یا ارسال به دستور تنها در صورتی صورت میگیرد که پرسوجو با موفقیت صفر یا چند تاپل (tuple) برگرداند، نه در مواقعی که پرسوجو ناموفق باشد یا یک دستور SQL باشد که دادهای بازنمیگرداند.
اگر بافر پرسوجوی فعلی خالی باشد، پرسوجوی ارسالشدهٔ اخیر دوباره اجرا میشود. به جز این مورد، دستور \g بدون آرگومان اساساً معادل با یک نقطهویرگول است. همراه با آرگومانها، \g یک جایگزین “یکباره” برای دستور \o فراهم میسازد و افزون بر آن، امکان تغییر یکبارهٔ گزینههای قالببندی خروجی را که معمولاً با \pset تنظیم میشوند فراهم میکند.
هنگامی که آخرین آرگومان با | آغاز شود، تمام دنبالهٔ خط به عنوان command برای اجرا تلقی میشود و هیچگونه درونیابی متغیر یا بسط نقلقول معکوس روی آن انجام نمیشود. باقیماندهٔ خط عینا به شل منتقل خواهد شد.
\gdesc
اگر بافر پرسوجوی فعلی خالی باشد، پرسوجوی ارسالشدهٔ اخیر توصیف میشود.
\getenv psql_var env_var
=> \getenv home HOME => \echo :home /home/postgres
\gexec
=> SELECT format('create index on my_table(%I)', attname)
-> FROM pg_attribute
-> WHERE attrelid = 'my_table'::regclass AND attnum > 0
-> ORDER BY attnum
-> \gexec
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX
پرسوجوهای تولیدشده به ترتیبی که سطرها بازگردانده میشوند، و از چپ به راست در هر سطر در صورتی که بیش از یک ستون وجود داشته باشد، اجرا میشوند. فیلدهای NULL نادیده گرفته میشوند. پرسوجوهای تولیدشده دقیقاً و به شکل عین عبارت برای پردازش به سرور ارسال میشوند، بنابراین نمیتوانند فرادستورهای psql بوده یا حاوی ارجاعات متغیر psql باشند. در صورت بروز خطا در هر پرسوجوی جداگانه، اجرای سایر پرسوجوها ادامه مییابد مگر آنکه ON_ERROR_STOP تنظیم شده باشد. اجرای هر پرسوجو تابع پردازش ECHO است. (تنظیم ECHO روی all یا queries هنگام استفاده از \gexec غالباً توصیه میشود.) ثبت وقایع پرسوجو، حالت تکمرحلهای، زمانبندی و سایر قابلیتهای اجرای پرسوجو روی هر پرسوجوی تولیدشده نیز اعمال خواهند شد.
اگر بافر پرسوجوی فعلی خالی باشد، پرسوجوی ارسالشدهٔ اخیر دوباره اجرا میشود. \gset [ prefix ]
=> SELECT 'hello' AS var1, 10 AS var2 -> \gset => \echo :var1 :var2 hello 10
اگر یک prefix مشخص کنید، آن رشته به ابتدای نامهای ستونهای پرسوجو افزوده میشود تا نام متغیرهای مورد استفاده ایجاد شوند:
=> SELECT 'hello' AS var1, 10 AS var2 -> \gset result_ => \echo :result_var1 :result_var2 hello 10
اگر نتیجهٔ یک ستون NULL باشد، متغیر متناظر بهجای مقداردهی، بازنشانی (unset) میشود.
اگر پرسوجو با شکست مواجه شود یا دقیقاً یک سطر بازنگرداند، هیچ متغیری تغییر نمیکند.
اگر بافر پرسوجوی جاری خالی باشد، در عوض پرسوجویی که اخیراً ارسال شده بود دوباره اجرا میشود.
\gx [ (option=value [...]) ] [ filename ]
\gx [ (option=value [...]) ] [ |command ]
\h or \help [ command ]
برخلاف بیشتر فرادستورهای دیگر، تمام باقیماندهٔ خط همیشه به عنوان آرگومان(های) \help در نظر گرفته میشود، و نه جایگذاری متغیرها و نه بسط بکتیک در آرگومانها انجام نمیشوند.
نکته
برای سادهتر کردن تایپ، نیازی نیست دستوراتی که از چند کلمه تشکیل شدهاند درون نقلقول قرار گیرند. بنابراین نوشتن \help alter table کاملاً مجاز است.
\H or \html
\i or \include filename
اگر filename برابر با - (خط پیوند) باشد، ورودی استاندارد تا رسیدن به نشانگر EOF یا فرادستور \q خوانده میشود. از این قابلیت میتوان برای آمیختن ورودی تعاملی با ورودی فایلها استفاده کرد. توجه داشته باشید که رفتار Readline تنها در صورتی استفاده خواهد شد که در بیرونیترین سطح فعال باشد.
نکته
اگر میخواهید خطوط را هنگام خوانده شدن روی صفحه مشاهده کنید، باید متغیر ECHO را روی all تنظیم کنید.
\if expression
\elif expression
\else
\endif
دستورات \if و \elif آرگومان(های) خود را خوانده و آنها را به عنوان یک عبارت بولی ارزیابی میکنند. اگر عبارت مقدار true به دست دهد، پردازش بهطور عادی ادامه مییابد؛ در غیر این صورت، خطوط نادیده گرفته میشوند تا زمانی که یک \elif، \else یا \endif مطابق پیدا شود. هنگامی که یک بررسی \if یا \elif موفق شد، آرگومانهای دستورات \elif بعدی در همان بلوک ارزیابی نمیشوند بلکه به عنوان false در نظر گرفته میشوند. خطوط پس از یک \else تنها در صورتی پردازش میشوند که هیچ \if یا \elif مطابق قبلی موفق نشده باشد.
آرگومان expression یک دستور \if یا \elif درست مانند هر آرگومان دستور بکاسلش دیگری، مشمول جایگذاری متغیرها و بسط بکتیک میشود. پس از آن، مانند مقدار یک متغیر گزینهٔ روشن/خاموش (on/off) ارزیابی میشود. بنابراین مقدار معتبر، هر تطابق بدون ابهام و غیرحساس به بزرگی و کوچکی حروف برای یکی از این موارد است: true، false، 1، 0، on، off، yes، no. برای نمونه، t، T و tR همگی به عنوان true در نظر گرفته خواهند شد.
عبارتهایی که بهدرستی به true یا false ارزیابی نشوند، یک هشدار تولید کرده و با آنها مانند false برخورد میشود.
خطوطی که رد میشوند، برای شناسایی پرسوجوها و دستورات بکاسلش بهطور عادی تجزیه میشوند، اما پرسوجوها به سرور فرستاده نمیشوند و دستورات بکاسلش به جز دستورات شرطی (\if، \elif، \else، \endif) نادیده گرفته میشوند. دستورات شرطی فقط برای تودرتویی معتبر بررسی میشوند. ارجاعات به متغیرها در خطوط ردشده بسط داده نمیشوند و بسط بکتیک نیز انجام نمیشود.
همهٔ دستورات بکاسلش یک بلوک شرطی دادهشده باید در همان فایل منبع قرار گیرند. اگر در فایل ورودی اصلی یا یک فایل واردشده با \include پیش از بسته شدن تمام بلوکهای \if محلی، به EOF برسد، آنگاه psql یک خطا صادر خواهد کرد.
در اینجا یک مثال آمده است:
-- check for the existence of two separate records in the database and store
-- the results in separate psql variables
SELECT
EXISTS(SELECT 1 FROM customer WHERE customer_id = 123) as is_customer,
EXISTS(SELECT 1 FROM employee WHERE employee_id = 456) as is_employee
\gset
\if :is_customer
SELECT * FROM customer WHERE customer_id = 123;
\elif :is_employee
\echo 'is not a customer but is an employee'
SELECT * FROM employee WHERE employee_id = 456;
\else
\if yes
\echo 'not a customer or employee'
\else
\echo 'this will never print'
\endif
\endif
\l[x+] یا \list[x+] [ pattern ]
\lo_export loid filename
نکته
برای یافتن OID شیء بزرگ، از \lo_list استفاده کنید.
\lo_import filename [ comment ]
foo=> \lo_import '/home/peter/pictures/photo.xcf' 'a picture of me' lo_import 152801
پاسخ نشان میدهد که شیء بزرگ شناسه شیء 152801 را دریافت کرده است، که میتواند در آینده برای دسترسی به شیء بزرگ تازه ایجادشده استفاده شود. برای خوانایی بهتر، توصیه میشود همیشه یک یادداشت خوانا برای انسان به هر شیء اختصاص دهید. هم OIDها و هم یادداشتها با دستور \lo_list قابل مشاهده هستند.
توجه داشته باشید که این دستور تفاوت ظریفی با دستور سمت سرور lo_import دارد زیرا به عنوان کاربر محلی روی سیستمفایل محلی عمل میکند، نه به عنوان کاربر و روی سیستمفایل سرور.
\lo_list[x+]
\lo_unlink loid
نکته
برای یافتن OID شیء بزرگ، از \lo_list استفاده کنید.
\o یا \out [ filename ]
\o یا \out [ |command ]
اگر آرگومان با | آغاز شود، تمام باقیمانده خط به عنوان command جهت اجرا در نظر گرفته میشود و هیچیک از فرایندهای جایگزینی متغیر یا بسط بکتیک در آن صورت نمیگیرد. باقیمانده خط صرفاً به صورت لفظی به شل ارسال میشود.
“نتایج پرسوجو” شامل همه جدولها، پاسخهای دستور و اعلانهای دریافتشده از سرور پایگاه داده، و همچنین خروجی دستورهای مختلف بکاسلش است که پایگاه داده را پرسوجو میکنند (مانند \d)؛ اما پیامهای خطا را در بر نمیگیرد.
نکته
برای قرار دادن خروجی متنی در میان نتایج پرسوجو، از \qecho استفاده کنید.
\p یا \print
\parse statement_name
مثال:
SELECT $1 \parse stmt1
این دستور موجب میشود پروتکل پرسوجوی گسترده (extended query protocol) مورد استفاده قرار گیرد، برخلاف عملکرد عادی psql که از پروتکل پرسوجوی ساده استفاده میکند. یک پیام Parse (F) توسط این دستور صادر خواهد شد، بنابراین میتواند برای آزمایش پروتکل پرسوجوی گسترده از طریق psql مفید باشد. این دستور تنها روی پرسوجوی بعدی که اجرا میشود تأثیر میگذارد؛ همه پرسوجوهای بعدی به طور پیشفرض از پروتکل پرسوجوی ساده استفاده خواهند کرد.
\password [ username ]
\prompt [ text ] name
به صورت پیشفرض، \prompt از ترمینال برای ورودی و خروجی استفاده میکند. با این حال، اگر گزینه خط فرمان -f استفاده شده باشد، \prompt از ورودی استاندارد و خروجی استاندارد استفاده میکند. \pset [ option [ value ] ]
\pset بدون هیچ آرگومانی، وضعیت فعلی تمام گزینههای چاپ را نمایش میدهد.
گزینههای چاپ قابل تنظیم عبارتند از:
border
columns
csv_fieldsep
expanded (یا x)
fieldsep
fieldsep_zero
footer
format
قالب aligned خروجی متنی استاندارد، خوانا برای انسان و با قالببندی مرتب است؛ این حالت پیشفرض است.
قالب unaligned تمام ستونهای یک سطر را در یک خط مینویسد که با جداکننده فیلد فعال فعلی جدا میشوند. این ویژگی برای ایجاد خروجیهایی که قرار است توسط برنامههای دیگر خوانده شوند، برای مثال قالبهای جداشده با تب یا ویرگول، مفید است. با این حال، اگر نویسهٔ جداکنندهٔ فیلد در مقدار یک ستون ظاهر شود، رفتار خاصی با آن صورت نمیگیرد؛ بنابراین قالب CSV ممکن است برای چنین مقاصدی مناسبتر باشد.
قالب csv مقادیر ستونها را با کاما جدا کرده و قواعد نقلقول شرحدادهشده در RFC 4180 را اعمال میکند. این خروجی با قالب CSV دستور COPY سرور سازگار است. یک خط سرایند با نام ستونها تولید میشود مگر اینکه پارامتر tuples_only روی on باشد. عناوین و پاورقیها چاپ نمیشوند. هر سطر به نویسهٔ پایان خط وابسته به سیستم ختم میشود، که معمولاً برای سیستمهای شبه یونیکس یک خطجدید یکتا (\n) یا برای Microsoft Windows توالی بازگشت به سطر و خطجدید (\r\n) است. نویسههای جداکننده فیلد غیر از ویرگول را میتوان با \pset csv_fieldsep انتخاب کرد.
قالب wrapped مانند aligned است اما مقادیر دادههای عریض را بین خطوط میپیچد تا خروجی در عرض ستون هدف بگنجد. عرض هدف همانطور که ذیل گزینهٔ columns شرح داده شد تعیین میشود. توجه داشته باشید که psql برای شکستن و پیچیدن عناوین سرایند ستون تلاشی نمیکند؛ بنابراین اگر کل عرض مورد نیاز برای سرایند ستونها از مقدار هدف فراتر رود، قالب wrapped مشابه aligned رفتار میکند.
قالبهای asciidoc، html، latex، latex-longtable و troff-ms جدولهایی را تولید میکنند که برای گنجانده شدن در اسناد با استفاده از زبان نشانهگذاری مربوطه طراحی شدهاند. اینها اسناد کامل نیستند! ممکن است این موضوع در HTML ضروری نباشد، اما در LaTeX باید یک پوشش سند کامل داشته باشید. قالب latex از محیط tabular در LaTeX استفاده میکند. قالب latex-longtable به بستههای longtable و booktabs در LaTeX نیاز دارد.
linestyle
سبک ascii از نویسههای سادهٔ ASCII استفاده میکند. خطوط جدید درون دادهها با یک نماد + در حاشیه سمت راست نمایش داده میشوند. هنگامی که قالب wrapped دادهها را از یک خط به خط بعدی بدون نویسهٔ خطجدید میپیچد، یک نقطه (.) در حاشیه سمت راست خط اول و مجدداً در حاشیه سمت چپ خط بعدی نشان داده میشود.
سبک old-ascii از نویسههای سادهٔ ASCII با سبک قالببندی مورد استفاده در PostgreSQL نسخهٔ 8.4 و پیش از آن استفاده میکند. خطوط جدید در دادهها با استفاده از نماد : به جای جداکنندهٔ ستون در سمت چپ نمایش داده میشوند. وقتی دادهها بدون نویسهٔ خطجدید از یک خط به خط بعدی پیچیده میشوند، یک نماد ; به جای جداکننده ستون سمت چپ به کار میرود.
سبک unicode از نویسههای رسم جعبه (box-drawing) یونیکد بهره میبرد. خطوط جدید در دادهها با نماد بازگشت به ابتدای سطر (carriage return) در حاشیه سمت راست نمایش داده میشوند. هنگامی که دادهها بدون نویسهٔ خطجدید از یک خط به خط بعدی میپیچند، یک نماد سهنقطه در حاشیه سمت راست خط اول و مجدداً در حاشیه سمت چپ خط بعدی نمایش داده میشود.
هنگامی که مقدار تنظیم border بزرگتر از صفر باشد، گزینهٔ linestyle نویسههایی را که خطوط حاشیه با آنها رسم میشوند نیز تعیین میکند. نویسههای سادهٔ ASCII در همه جا کار میکنند، اما نویسههای یونیکد در نمایشگرهایی که آنها را پشتیبانی میکنند زیباتر دیده میشوند. null
numericlocale
pager
اگر متغیر محیطی PSQL_PAGER یا PAGER تنظیم شده باشد، خروجی مورد نظر برای صفحهبندی به برنامه مشخصشده هدایت (pipe) میشود. در غیر این صورت، از یک برنامه پیشفرض وابسته به پلتفرم (مانند more) استفاده میشود.
هنگام استفاده از دستور \watch برای اجرای مکرر یک پرسوجو در سیستمهای یونیکس، متغیر محیطی PSQL_WATCH_PAGER به جای آن برای یافتن برنامه صفحهبند استفاده میشود. این متغیر به طور جداگانه پیکربندی میشود زیرا ممکن است صفحهبندهای سنتی را دچار سردرگمی کند، اما میتواند برای ارسال خروجی به ابزارهایی که قالب خروجی psql را میفهمند (مانند pspg --stream) استفاده شود.
pager_min_lines
recordsep
recordsep_zero
tableattr (یا T)
در قالب latex-longtable، این گزینه عرض متناسب هر ستونی را که شامل نوع داده چپچین است کنترل میکند. این ویژگی به عنوان فهرستی از مقادیر جداشده با فاصله مشخص میشود، مانند '0.2 0.2 0.6'. ستونهای خروجی مشخصنشده از آخرین مقدار مشخصشده استفاده میکنند.
title (یا C)
tuples_only (یا t)
unicode_border_linestyle
unicode_column_linestyle
unicode_header_linestyle
xheader_width
full: سرستون گسترشیافته کوتاه (قطع) نمیشود و به پهنای عریضترین خط خروجی خواهد بود.
column: خط سرستون را تا پهنای ستون اول کوتاه میکند.
page: خط سرستون را تا پهنای ترمینال کوتاه میکند.
integer value: حداکثر پهنای دقیق خط سرستون را مشخص میکند.
نمونههایی از چگونگی ظاهر این قالبهای مختلف را میتوان در بخش مثالها، در ادامه مشاهده کرد.
نکته
دستورهای میانبر گوناگونی برای \pset وجود دارند. بخشهای \a، \C، \f، \H، \t، \T و \x را ببینید.
\q یا \quit
\qecho text [ ... ]
\restrict restrict_key
این دستور در درجه اول برای استفاده در نسخههای پشتیبان متنی (plain-text dumps) ایجاد شده توسط pg_dump، pg_dumpall و pg_restore در نظر گرفته شده است، اما ممکن است در جاهای دیگر نیز مفید باشد.
\s [ filename ]
\set [ name [ value [ ... ] ] ]
\set بدون هیچ آرگومانی، نام و مقدار تمام متغیرهای تنظیمشده کنونی psql را نمایش میدهد.
نامهای معتبر متغیرها میتوانند شامل حروف، ارقام و زیرخط باشند. برای جزئیات به Variables در زیر مراجعه کنید. نام متغیرها به حروف بزرگ و کوچک حساس هستند.
برخی از متغیرها خاص هستند، به این صورت که رفتار psql را کنترل میکنند یا بهطور خودکار برای بازتاب وضعیت اتصال تنظیم میشوند. این متغیرها در Variables در زیر مستند شدهاند.
نکته
این دستور ارتباطی با دستور SQL یعنی SET ندارد.
\setenv name [ value ]
testdb=> \setenv PAGER less testdb=> \setenv LESS -imx4F
\sf[+] function_description
تابع هدف را میتوان تنها با نام، یا با نام و آرگومانها مشخص کرد، به عنوان مثال foo(integer, text). در صورتی که بیش از یک تابع با همین نام وجود داشته باشد، انواع آرگومانها حتماً باید مشخص شوند.
اگر + به انتهای نام دستور اضافه شود، خطوط خروجی شمارهگذاری میشوند و اولین خط از بدنه تابع، خط شماره ۱ خواهد بود.
برخلاف اکثر متادستورهای دیگر، کل ادامه خط همیشه به عنوان آرگومان(های) \sf در نظر گرفته میشود، و نه درونیابی متغیرها و نه بسط علامت نقلقول وارون روی آرگومانها اعمال نمیشود.
\sv[+] view_name
اگر + به انتهای نام دستور اضافه شود، خطوط خروجی از ۱ شمارهگذاری میشوند.
برخلاف اکثر متادستورهای دیگر، کل ادامه خط همیشه به عنوان آرگومان(های) \sv در نظر گرفته میشود، و نه درونیابی متغیرها و نه بسط علامت نقلقول وارون روی آرگومانها اعمال نمیشود.
\startpipeline
\sendpipeline
\syncpipeline
\endpipeline
\flushrequest
\flush
\getresults [ number_results ]
تمام پرسوجوهایی که در حین اجرای خطلوله اجرا میشوند از پروتکل پرسوجوی توسعهیافته (extended query protocol) استفاده میکنند. پرسوجوها در صورتی که با یک نقطهویرگول (semicolon) پایان یابند، به خطلوله الحاق میشوند. متادستورهای \bind، \bind_named، \close_prepared یا \parse میتوانند در یک خطلوله در حال اجرا استفاده شوند. در زمان فعال بودن خطلوله، \sendpipeline بافر پرسوجوی جاری را به خطلوله الحاق میکند. سایر متادستورها مانند \g، \gx یا \gdesc در حالت خطلوله مجاز نیستند.
دستور \flushrequest یک دستور تخلیه (flush) را به خطلوله الحاق میکند که امکان خواندن نتایج با \getresults را بدون صدور همگامسازی (sync) یا پایان دادن به خطلوله فراهم میآورد. دستور \getresults بهطور خودکار دادههای ارسالنشده را به سرور منتقل (push) میکند. برای انتقال دستی دادههای ارسالنشده میتوان از \flush استفاده کرد.
دستور \getresults یک پارامتر اختیاری number_results را میپذیرد. در صورت ارائه، تنها تعداد number_results نتیجهٔ اول در انتظار خوانده خواهند شد. در صورت ارائه نشدن یا مقدار 0، تمام نتایج در انتظار خوانده میشوند.
هنگامی که حالت خطلوله فعال است، یک متغیر اعلان (prompt) اختصاصی برای گزارش وضعیت خطلوله در دسترس است. برای جزئیات بیشتر به %P مراجعه کنید.
دستور COPY در هنگام قرار داشتن در حالت خطلوله پشتیبانی نمیشود.
مثال:
\startpipeline SELECT * FROM pg_class; SELECT 1 \bind \sendpipeline \flushrequest \getresults \endpipeline
\t
\T table_options
\timing [ on | off ]
\unrestrict restrict_key
این دستور در درجهٔ اول برای استفاده در رونوشتهای متنساده (plain-text dumps) تولیدشده توسط pg_dump، pg_dumpall و pg_restore در نظر گرفته شده است، اما ممکن است در جاهای دیگر نیز سودمند باشد.
برخلاف اغلب فرادستورهای دیگر، کل باقیماندهٔ سطر همیشه به عنوان آرگومانِ \unrestrict در نظر گرفته میشود، و نه درونیابی متغیرها و نه بسط بکتیک در آن انجام نمیگیرد.
\unset name
بیشتر متغیرهایی که رفتار psql را کنترل میکنند نمیتوانند حذف شوند؛ در عوض، دستور \unset به صورت بازگرداندن آنها به مقادیر پیشفرضشان تفسیر میشود. بخش Variables در زیر را ببینید.
\w یا \write filename
\w یا \write |command
اگر آرگومان با | آغاز شود، آنگاه کل باقیماندهٔ سطر به عنوان command برای اجرا در نظر گرفته میشود و نه درونیابی متغیرها و نه بسط بکتیک در آن انجام نمیگیرد. بقیه سطر صرفاً به صورت لفظی و بدون تغییر به پوسته ارسال میشود.
\warn text [ ... ]
\watch [ i[nterval]=seconds ] [ c[ount]=times ] [ m[in_rows]=rows ] [ seconds ]
اگر بافر پرسوجوی جاری خالی باشد، آخرین پرسوجوی ارسالشده به جای آن دوباره اجرا میشود.
\x [ on | off | auto ]
\z[Sx] [ pattern ]
این یک نام مستعار (alias) برای \dp (“display privileges”) است.
\! [ command ]
برخلاف بیشتر فرادستورهای دیگر، کل باقیماندهٔ سطر همیشه به عنوان آرگومان(های) \! در نظر گرفته میشود، و در آرگومانها نه درونیابی متغیر و نه بسط بکتیک انجام نمیگیرد. بقیه سطر صرفاً به صورت لفظی به پوسته ارسال میشود.
\? [ topic ]
\;
بهطور معمول، psql به محض رسیدن به نقطهویرگولِ پایاندهندهٔ دستور، حتی اگر ورودی بیشتری در سطر جاری باقی مانده باشد، دستور SQL را به سرور ارسال میکند. بنابراین برای مثال وارد کردن:
select 1; select 2; select 3;
منجر به ارسال جداگانهٔ این سه دستور SQL به سرور میشود، بهطوری که نتایج هر یک پیش از ادامه به دستور بعدی نمایش داده خواهد شد. با این حال، نقطهویرگولی که به صورت \; وارد شود، پردازش دستور را آغاز نمیکند؛ در نتیجه دستورِ پیش از آن و دستورِ پس از آن عملاً با یکدیگر ترکیب شده و در قالب یک درخواست به سرور ارسال میشوند. بنابراین برای مثال:
select 1\; select 2\; select 3;
منجر به ارسال هر سه دستور SQL به سرور در یک درخواست واحد میشود، زمانی که به نقطهویرگولِ بدون بکاسلش رسیده شود. سرور چنین درخواستی را به عنوان یک تراکنش واحد اجرا میکند، مگر آنکه دستورهای صریح BEGIN/COMMIT در رشته گنجانده شده باشند تا آن را به چندین تراکنش تقسیم کنند. (برای جزئیات بیشتر دربارهٔ نحوهٔ مدیریت رشتههای چندپرسوجویی توسط سرور، Section 54.2.2.1 را ببینید.)
الگوها (Patterns)
دستورهای مختلف \d یک پارامتر pattern را برای تعیین نام شیء (یا اشیاء) برای نمایش میپذیرند. در سادهترین حالت، یک الگو صرفاً همان نام دقیق شیء است. نویسههای درون یک الگو معمولاً مانند نامها در SQL به حروف کوچک تبدیل میشوند؛ برای مثال، \dt FOO جدولی به نام foo را نمایش میدهد. همانند نامهای SQL، قرار دادن علامت نقلقول دوتایی (double quotes) در دو طرف یک الگو، مانع از تبدیل آن به حروف کوچک میشود. در صورتی که نیاز به گنجاندن یک نویسهٔ نقلقول دوتایی واقعی درون یک الگو داشته باشید، آن را به صورت یک جفت نقلقول دوتایی در یک توالی نقلقول دوتایی بنویسید؛ این موضوع نیز مطابق با قواعد شناسههای نقلقولشدهٔ SQL است. برای نمونه، \dt "FOO""BAR" جدولی به نام FOO"BAR (نه foo"bar) را نمایش میدهد. برخلاف قواعد معمول نامهای SQL، میتوانید علامت نقلقول دوتایی را تنها در اطراف بخشی از یک الگو قرار دهید، برای مثال \dt FOO"FOO"BAR جدولی به نام fooFOObar را نمایش خواهد داد..PP هر زمان که پارامتر pattern بهطور کامل حذف شود، دستورهای \d تمام اشیائی را که در مسیر جستجوی شِمای جاری قابل رؤیت هستند نمایش میدهند — این معادل استفاده از * به عنوان الگو است. (گفته میشود یک شیء قابل رؤیت است اگر شِمای دربردارنده آن در مسیر جستجو قرار داشته باشد و هیچ شیء دیگری از همان نوع و با همان نام جلوتر در مسیر جستجو ظاهر نشده باشد. این بدان معناست که شیء میتواند با نام خود و بدون قید صریح شِما مورد ارجاع قرار گیرد.) برای مشاهده همه اشیاء پایگاه داده بدون در نظر گرفتن قابلیت رؤیت، از *.* به عنوان الگو استفاده کنید.
درون یک الگو، * با هر توالی از نویسهها (شامل هیچ نویسهای هم) تطابق مییابد و ? با هر تکنویسهای مطابقت میکند. (این نشانهگذاری با الگوهای نام فایل در پوسته Unix قابل مقایسه است.) برای مثال، \dt int* جدولهایی را که نام آنها با int آغاز میشود نمایش میدهد. اما درون نقلقولهای دوتایی، * و ? این معانی خاص را از دست میدهند و صرفاً به صورت لفظی مطابقت داده میشوند.
الگوی رابطهای که شامل یک نقطه (.) باشد، به عنوان یک الگوی نام شِما که به دنبال آن یک الگوی نام شیء آمده تفسیر میشود. برای مثال، \dt foo*.*bar* تمام جدولهایی را نمایش میدهد که نام جدول شامل bar بوده و در شِماهایی قرار دارند که نام شِمای آنها با foo آغاز میشود. هنگامی که نقطهای وجود نداشته باشد، الگو تنها با اشیائی مطابقت پیدا میکند که در مسیر جستجوی شِمای جاری قابل رؤیت باشند. باز هم، یک نقطه درون نقلقولهای دوتایی معنای خاص خود را از دست میدهد و به صورت لفظی تطبیق داده میشود. الگوی رابطهای که شامل دو نقطه (.) باشد، به عنوان یک نام پایگاه داده که پس از آن الگوی نام شِما و به دنبال آن الگوی نام شیء قرار گرفته تفسیر میگردد. با بخش نام پایگاه داده به عنوان الگو رفتار نمیشود و باید دقیقاً با نام پایگاه دادهای که هماکنون به آن متصل هستید مطابقت داشته باشد، در غیر این صورت خطایی رخ خواهد داد.
الگوی شِمایی که شامل یک نقطه (.) باشد، به عنوان نام پایگاه داده که به دنبال آن الگوی نام شِما آمده است تفسیر میشود. برای مثال، \dn mydb.*foo* همه شِماهایی را نمایش میدهد که نام شِمای آنها شامل foo است. با بخش نام پایگاه داده به عنوان الگو برخورد نخواهد شد و باید با نام پایگاه دادهای که در حال حاضر به آن متصل هستید مطابقت داشته باشد، در غیر این صورت خطا صادر میشود.
کاربران پیشرفته میتوانند از نشانهگذاریهای عبارت باقاعده (regular-expression) مانند ردههای نویسه، برای مثال [0-9] جهت مطابقت با هر رقمی استفاده کنند. تمام نویسههای خاص عبارتهای باقاعده همانطور که در بخش 9.7.3 مشخص شده عمل میکنند، به جز . که همانطور که در بالا ذکر شد به عنوان جداکننده در نظر گرفته میشود، * که به نشانهگذاری عبارت باقاعده .* ترجمه میشود، ? که به . ترجمه میشود، و $ که به صورت لفظی مطابقت مییابد. شما میتوانید در صورت نیاز این نویسههای الگو را با نوشتن ? به جای .، (R+|) به جای R*، یا (R|) به جای R? شبیهسازی کنید. به $ به عنوان یک نویسه عبارت باقاعده نیازی نیست، چرا که بر خلاف تفسیر معمول از عبارتهای باقاعده، الگو باید با کل نام مطابقت داشته باشد (به عبارت دیگر، $ به طور خودکار به انتهای الگوی شما پیوست میشود). اگر نمیخواهید الگو لنگراندازی (anchored) شود، * را در ابتدا و/یا انتهای آن قرار دهید. توجه داشته باشید که درون نقلقول دوتایی، همه نویسههای خاص عبارت باقاعده معانی خاص خود را از دست میدهند و به صورت لفظی مطابقت مییابند. همچنین، نویسههای خاص عبارت باقاعده در الگوهای نام عملگر (یعنی آرگومانِ \do) به صورت لفظی مطابقت داده میشوند.
ویژگیهای پیشرفته (Advanced Features)
متغیرها
(Variables)
دستور psql قابلیتهای جایگزینی متغیر را مشابه پوستههای خط فرمان متداول Unix فراهم میکند. متغیرها صرفاً جفتهای نام/مقدار هستند که در آنها مقدار میتواند هر رشتهای با هر طولی باشد. نام متغیر باید از حروف (شامل حروف غیرلاتین)، ارقام، و زیرخطها تشکیل شده باشد.
برای تنظیم یک متغیر، از فرافرمان psql با نام \set استفاده کنید. برای مثال،
testdb=> \set foo bar
متغیر foo را روی مقدار bar تنظیم میکند. برای بازیابی محتوای متغیر، یک دونقطه پیش از نام آن قرار دهید، برای مثال:
testdb=> \echo :foo bar
این قابلیت هم در دستورهای عادی SQL و هم در فرافرمانها کار میکند؛ جزئیات بیشتر در بخش «درونیابی SQL» (SQL Interpolation) در زیر آمده است.
اگر \set را بدون آرگومان دوم فراخوانی کنید، متغیر روی یک مقدار رشته تهی تنظیم میشود. برای لغو تنظیم (یعنی حذف) یک متغیر، از دستور \unset استفاده کنید. برای نمایش مقادیر تمام متغیرها، \set را بدون هیچ آرگومانی فراخوانی کنید.
نکته (Note)
آرگومانهای \set مشمول همان قواعد جایگزینی سایر دستورها هستند. بدین ترتیب میتوانید ارجاعهای جالبی مانند \set :foo 'something' بسازید و به ترتیب به “پیوندهای نرم” یا “متغیرهای متغیری” معروف در Perl یا PHP دست یابید. متأسفانه (یا خوشبختانه؟)، هیچ راهی برای انجام کار مفیدی با این ساختارها وجود ندارد. از سوی دیگر، \set bar :foo روشی کاملاً معتبر برای رونوشت برداشتن از یک متغیر است.
تعدادی از این متغیرها توسط psql به شکلی ویژه مدیریت میشوند. آنها تنظیمات گزینهای خاصی را نشان میدهند که میتوانند در زمان اجرا با تغییر دادن مقدار متغیر دگرگون شوند، یا در برخی موارد نمایانگر وضعیت قابل تغییر psql هستند. طبق قرارداد، نام تمام متغیرهایی که با آنها بهطور خاص رفتار میشود، همگی از حروف بزرگ ASCII (و احتمالاً ارقام و زیرخطها) تشکیل شدهاند. برای اطمینان از حداکثر سازگاری در آینده، از استفاده از چنین نامهایی برای مقاصد شخصی خود خودداری کنید.
متغیرهایی که رفتار psql را کنترل میکنند عموماً نمیتوانند لغو تنظیم (unset) شوند یا روی مقادیر نامعتبر تنظیم گردند. اجرای دستور \unset مجاز است اما به عنوان تنظیم متغیر روی مقدار پیشفرض آن تفسیر میشود. دستور \set بدون آرگومان دوم، برای متغیرهای کنترلی که مقدار on را میپذیرند، به عنوان تنظیم متغیر روی on تفسیر میشود و برای بقیه متغیرها رد خواهد شد. همچنین، متغیرهای کنترلی که مقادیر on و off را میپذیرند، سایر نگارشهای متداول مقادیر بولی مانند true و false را نیز خواهند پذیرفت.
متغیرهایی که بهطور ویژه مدیریت میشوند عبارتند از:
AUTOCOMMIT
نکته (Note)
در حالت autocommit-off، باید هر تراکنش ناموفق را با وارد کردن ABORT یا ROLLBACK صراحتاً رها کنید. همچنین به یاد داشته باشید که اگر بدون تثبیت کردن از نشست خارج شوید، کارهای شما از بین خواهد رفت.
نکته (Note)
حالت autocommit-on رفتار سنتی PostgreSQL است، اما حالت autocommit-off به مشخصات استاندارد SQL نزدیکتر است. اگر autocommit-off را ترجیح میدهید، ممکن است بخواهید آن را در فایل سراسری psqlrc سیستم یا فایل شخصی ~/.psqlrc خود تنظیم کنید.
DBNAME
ECHO
ECHO_HIDDEN
ENCODING
ERROR
FETCH_COUNT
نکته
اگرچه میتوانید از هر قالب خروجی با این ویژگی استفاده کنید، قالب پیشفرض aligned معمولاً ظاهر مناسبی پیدا نمیکند زیرا هر گروه از سطرهای FETCH_COUNT به صورت جداگانه قالببندی میشوند، که باعث ایجاد عرضهای متغیر برای ستونها در بین گروههای سطر خواهد شد. سایر قالبهای خروجی عملکرد بهتری دارند.
HIDE_TABLEAM
HIDE_TOAST_COMPRESSION
HISTCONTROL
یادداشت
این ویژگی بیشرمانه از Bash کپیبرداری شده است.
HISTFILE
\set HISTFILE ~/.psql_history-:DBNAME
در ~/.psqlrc باعث خواهد شد psql یک تاریخچه جداگانه برای هر پایگاه داده نگهداری کند.
یادداشت
این ویژگی بیشرمانه از Bash کپیبرداری شده است.
HISTSIZE
یادداشت
این ویژگی بیشرمانه از Bash کپیبرداری شده است.
HOST
IGNOREEOF
یادداشت
این ویژگی بیشرمانه از Bash کپیبرداری شده است.
LAST_ERROR_MESSAGE
LAST_ERROR_SQLSTATE
ON_ERROR_ROLLBACK
ON_ERROR_STOP
PIPELINE_COMMAND_COUNT
PIPELINE_RESULT_COUNT
PIPELINE_SYNC_COUNT
PORT
PROMPT1
PROMPT2
PROMPT3
QUIET
ROW_COUNT
SERVER_VERSION_NAME
SERVER_VERSION_NUM
SERVICE
SHELL_ERROR
SHELL_EXIT_CODE
SHOW_ALL_RESULTS
SHOW_CONTEXT
SINGLELINE
SINGLESTEP
SQLSTATE
VERBOSITY
VERSION
VERSION_NAME
VERSION_NUM
WATCH_INTERVAL
درونیابی
در SQL (SQL Interpolation)
یکی از ویژگیهای کلیدی متغیرهای psql این است که میتوانید آنها را در دستورات عادی SQL و همچنین آرگومانهای فرادستورها جایگزین («درونیابی») کنید. علاوه بر این، psql امکاناتی فراهم میکند تا اطمینان حاصل شود مقادیر متغیرهای مورد استفاده بهعنوان لیترالها و شناسههای SQL بهدرستی درون علامت نقلقول (quote) قرار میگیرند. نحوِ درونیابی یک مقدار بدون هیچگونه نقلقول، قرار دادن دونقطه (:) قبل از نام متغیر است. برای نمونه،
testdb=> \set foo 'my_table' testdb=> SELECT * FROM :foo;
از جدول my_table پرسوجو میکند. توجه داشته باشید که این کار ممکن است ناامن باشد: مقدار متغیر بهصورت لفظی کپی میشود، بنابراین میتواند حاوی نقلقولهای نامتوازن یا حتی دستورات ممیز وارونه (backslash) باشد. باید مطمئن شوید مقداری که قرار میدهید در آن جایگاه معنای درستی دارد.
هنگامی که قرار است مقداری بهعنوان یک لیترال یا شناسهٔ SQL استفاده شود، ایمنترین روش این است که در نقلقول قرار داده شود. برای نقلقول کردن مقدار یک متغیر بهعنوان یک لیترال SQL، یک دونقطه و سپس نام متغیر را درون گیومهٔ تکی (single quote) بنویسید. برای نقلقول کردن مقدار بهعنوان یک شناسهٔ SQL، یک دونقطه و سپس نام متغیر را درون گیومهٔ دوتایی (double quote) بنویسید. این ساختارها بهدرستی با نقلقولها و سایر نویسههای خاصِ درون مقدار متغیر برخورد میکنند. مثال قبلی را میتوان با ایمنی بیشتر به این شکل نوشت:
testdb=> \set foo 'my_table' testdb=> SELECT * FROM :"foo";
درونیابی متغیر در لیترالها و شناسههای نقلقولشدهٔ SQL انجام نخواهد شد. بنابراین، ساختاری مانند ':foo' برای تولید یک لیترال نقلقولشده از مقدار متغیر کارایی ندارد (و حتی در صورت کارایی نیز ناامن میبود، زیرا نمیتوانست نقلقولهای نهفته در مقدار را بهدرستی مدیریت کند).
یک نمونه کاربرد این سازوکار، کپی کردن محتوای یک فایل درون یک ستون از جدول است. ابتدا فایل را درون یک متغیر بارگذاری کرده و سپس مقدار متغیر را بهعنوان یک رشتهٔ نقلقولشده درج کنید:
testdb=> \set content `cat my_file.txt` testdb=> INSERT INTO my_table VALUES (:'content');
(توجه داشته باشید که اگر my_file.txt حاوی بایتهای NUL باشد، این روش کار نخواهد کرد. psql از بایتهای NUL درون مقادیر متغیرها پشتیبانی نمیکند.)
از آنجا که علامت دونقطه میتواند بهطور قانونی در دستورات SQL ظاهر شود، تلاشی ظاهری برای درونیابی (یعنی :name، :'name'، یا :"name") جایگزین نخواهد شد مگر اینکه متغیرِ نامبرده در حال حاضر تنظیم شده باشد. در هر صورت، میتوانید با یک ممیز وارونه (backslash) علامت دونقطه را گریزدهی (escape) کنید تا از جایگزینی محافظت شود.
نحو ویژهٔ :{?name} بسته به وجود یا عدم وجود متغیر، مقدار TRUE یا FALSE برمیگرداند و بنابراین همیشه جایگزین میشود، مگر اینکه دونقطه با ممیز وارونه گریزدهی شده باشد.
نحو دونقطه برای متغیرها، استاندارد SQL برای زبانهای پرسوجوی تعبیهشده (مانند ECPG) است. نحوهای دونقطه برای برشهای آرایه (array slices) و تبدیل نوعها (type casts) از افزونههای PostgreSQL هستند که گاهی ممکن است با کاربرد استاندارد تداخل داشته باشند. نحو دونقطه-گیومه برای گریزدهی مقدار یک متغیر بهعنوان یک لیترال یا شناسهٔ SQL، از افزونههای ویژهٔ psql است.
اعلانها
(Prompting)
اعلانهایی (prompts) که psql صادر میکند را میتوان مطابق با اولویتهای خود سفارشی کرد. سه متغیر PROMPT1، PROMPT2، و PROMPT3 شامل رشتهها و توالیهای گریز ویژهای هستند که ظاهر اعلان را توصیف میکنند. اعلان ۱، اعلان عادی است که هنگام درخواست یک دستور جدید توسط psql نمایش داده میشود. اعلان ۲ زمانی ظاهر میشود که در هنگام ورود دستور به ورودی بیشتری نیاز باشد؛ برای نمونه به این دلیل که دستور با نقطهویرگول (semicolon) خاتمه نیافته یا یک گیومه بسته نشده است. اعلان ۳ زمانی نمایش داده میشود که در حال اجرای دستور SQL به صورت COPY FROM STDIN هستید و باید مقادیر ردیف را در ترمینال تایپ کنید.
مقدار متغیرِ اعلانِ انتخابشده بهصورت لفظی چاپ میشود، مگر در جایی که علامت درصد (%) وجود داشته باشد. بسته به نویسهٔ بعدی، متن مشخص دیگری بهجای آن جایگزین میشود. جایگزینیهای تعریفشده عبارتند از:
%M
%m
%>
%n
%s
%/
%~
%#
%P
%R
%x
%l
%digits
%:name:
%`command`
%[ ... %]
testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%# '
در پایانههای سازگار با VT100 و با قابلیت نمایش رنگ، منجر به یک اعلان پررنگ (1;) با رنگ زرد روی مشکی (33;40) میشود.
%w
نکته
این قابلیت بیشرمانه از tcsh کپیبرداری شده است.
ویرایش
خط فرمان (Command-Line
Editing)
psql در صورت در دسترس بودن، از کتابخانهٔ Readline یا libedit برای ویرایش و بازیابی راحت خطوط استفاده میکند. تاریخچهٔ دستورها هنگام خروج psql به طور خودکار ذخیره شده و هنگام راهاندازی مجدد psql دوباره بارگذاری میشود. کلید جهتنمای رو به بالا یا control-P را برای بازیابی خطوط پیشین فشار دهید.
شما همچنین میتوانید از تکمیل خودکار با کلید تب (tab completion) برای پر کردن کلیدواژهها و نام اشیاء SQL که ناتمام تایپ شدهاند در بسیاری از زمینهها (نه الزاماً همهٔ موارد) استفاده کنید. برای مثال، در ابتدای یک دستور، تایپ کردن ins و فشردن TAB عبارت insert into را تکمیل میکند. سپس، با تایپ چند نویسه از نام جدول یا طرحواره (schema) و زدن TAB، نام ناتمام تکمیل میشود یا در صورتی که بیش از یک مورد وجود داشته باشد، منویی از گزینههای ممکن پیشنهاد میگردد. (بسته به کتابخانهٔ مورد استفاده، ممکن است برای دریافت منو نیاز باشد TAB را بیش از یک بار فشار دهید.)
تکمیل با تب برای نام اشیاء SQL نیازمند ارسال پرسوجوهایی به سرور جهت یافتن موارد منطبق است. در برخی شرایط این کار میتواند با سایر عملیات تداخل پیدا کند. برای مثال، پس از BEGIN، اگر در این میان یک پرسوجوی تکمیل تب ارسال شود، صدور SET TRANSACTION ISOLATION LEVEL بسیار دیر خواهد بود. اگر اصلاً مایل به استفاده از تکمیل خودکار با تب نیستید، میتوانید با قرار دادن این دستورها در فایلی به نام .inputrc در دایرکتوری خانگی خود، آن را برای همیشه غیرفعال کنید:
$if psql set disable-completion on $endif
(این ویژگی متعلق به psql نیست بلکه قابلیتی از Readline است. برای جزئیات بیشتر مستندات آن را مطالعه کنید.)
گزینهٔ خط فرمان -n (--no-readline) نیز میتواند برای غیرفعال کردن استفاده از Readline تنها برای یک بار اجرای psql مفید باشد. این گزینه مانع از تکمیل با تب، استفاده یا ثبت تاریخچهٔ خط فرمان، و ویرایش دستورهای چندخطی میشود. این ویژگی بهویژه زمانی سودمند است که نیاز به رونوشت و جایگذاری (copy-and-paste) متنی دارید که شامل نویسههای TAB است.
COLUMNS
PGDATABASE
PGHOST
PGPORT
PGUSER
PG_COLOR
PSQL_EDITOR
EDITOR
VISUAL
PSQL_EDITOR_LINENUMBER_ARG
PSQL_EDITOR_LINENUMBER_ARG='+' PSQL_EDITOR_LINENUMBER_ARG='--line '
مقدار پیشفرض در سیستمهای یونیکس + است (مطابق با ویرایشگر پیشفرض vi، و مفید برای بسیاری از ویرایشگرهای رایج دیگر)؛ اما در سیستمهای ویندوز هیچ مقدار پیشفرضی وجود ندارد.
PSQL_HISTORY
PSQL_PAGER
PAGER
PSQL_WATCH_PAGER
PSQLRC
SHELL
TMPDIR
این ابزار، مانند اکثر ابزارهای دیگر PostgreSQL، از متغیرهای محیطی پشتیبانیشده توسط libpq نیز استفاده میکند (بخش 32.15 را ببینید)..SH "فایلها (FILES)"
psqlrc و ~/.psqlrc
فایل راهاندازی سراسری سیستم psqlrc نام دارد. بهطور پیشفرض در دایرکتوری “پیکربندی سیستم” محل نصب جستجو میشود که مطمئنترین روش شناسایی آن، اجرای pg_config --sysconfdir است. معمولاً این دایرکتوری نسبت به دایرکتوری حاوی فایلهای اجرایی PostgreSQL، در مسیر ../etc/ قرار دارد. دایرکتوری مورد نظر برای جستجو را میتوان صراحتاً از طریق متغیر محیطی PGSYSCONFDIR تعیین کرد.
فایل راهاندازی شخصی کاربر .psqlrc نام دارد و در دایرکتوری خانگی کاربر فراخواننده جستجو میشود. در Windows، فایل راهاندازی شخصی در عوض %APPDATA%\postgresql\psqlrc.conf نام دارد. در هر دو حالت، میتوان این مسیر پیشفرض فایل را با تنظیم متغیر محیطی PSQLRC تغییر داد.
هر دو فایل راهاندازی سراسری سیستم و فایل راهاندازی شخصی کاربر را میتوان با الحاق یک خط تیره و شناسهٔ نسخهٔ اصلی یا فرعی PostgreSQL به نام فایل، مختص نسخهٔ psql کرد؛ برای مثال ~/.psqlrc-18 یا ~/.psqlrc-18.6. فایلی که دقیقترین تطابق نسخه را داشته باشد، با اولویت نسبت به فایل بدون نسخه خوانده خواهد شد. این پسوندهای نسخه پس از تعیین مسیر فایل بهگونهای که در بالا توضیح داده شد، اضافه میشوند.
.psql_history
محل فایل تاریخچه را میتوان صراحتاً از طریق متغیر psql به نام HISTFILE یا متغیر محیطی PSQL_HISTORY تعیین کرد.
نکات (NOTES)
اگر میخواهید از psql برای اتصال به چندین سرور با نسخههای اصلی متفاوت استفاده کنید، توصیه میشود از جدیدترین نسخهٔ psql استفاده کنید. متناوباً، میتوانید نسخهای از psql را برای هر نسخهٔ اصلی نگه دارید و مطمئن شوید که از نسخهای متناسب با سرور مربوطه استفاده میکنید. اما در عمل، این پیچیدگی مضاعف نباید لازم باشد.
نکات برای کاربران ویندوز (NOTES FOR WINDOWS USERS)
psql به عنوان یک “برنامهٔ کنسول” ساخته شده است. از آنجا که پنجرههای کنسول Windows از کدگذاری متفاوتی نسبت به سایر بخشهای سیستم استفاده میکنند، باید هنگام استفاده از نویسههای ۸-بیتی درون psql توجه ویژهای داشته باشید. در صورتی که psql یک صفحهٔ کد کنسول مشکلساز را تشخیص دهد، در زمان راهاندازی هشدار خواهد داد. برای تغییر صفحهٔ کد کنسول، دو اقدام لازم است:
نخستین مثال نشان میدهد چگونه میتوان یک دستور را در چندین خط ورودی گسترش داد. به تغییر اعلان توجه کنید:
testdb=> CREATE TABLE my_table ( testdb(> first integer not null default 0, testdb(> second text) testdb-> ; CREATE TABLE
اکنون دوباره به تعریف جدول نگاه کنید:
testdb=> \d my_table
Table "public.my_table"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
first | integer | | not null | 0
second | text | | |
اکنون اعلان را به چیزی جالبتر تغییر میدهیم:
testdb=> \set PROMPT1 '%n@%m %~%R%# ' peter@localhost testdb=>
فرض کنید جدول را با دادهها پر کردهاید و میخواهید نگاهی به آن بیندازید:
peter@localhost testdb=> SELECT * FROM my_table;
first | second
-------+--------
1 | one
2 | two
3 | three
4 | four
(4 rows)
میتوانید با استفاده از دستور \pset جدولها را به روشهای گوناگونی نمایش دهید:
peter@localhost testdb=> \pset border 2
Border style is 2.
peter@localhost testdb=> SELECT * FROM my_table;
+-------+--------+
| first | second |
+-------+--------+
| 1 | one |
| 2 | two |
| 3 | three |
| 4 | four |
+-------+--------+
(4 rows)
peter@localhost testdb=> \pset border 0
Border style is 0.
peter@localhost testdb=> SELECT * FROM my_table;
first second
----- ------
1 one
2 two
3 three
4 four
(4 rows)
peter@localhost testdb=> \pset border 1
Border style is 1.
peter@localhost testdb=> \pset format csv
Output format is csv.
peter@localhost testdb=> \pset tuples_only
Tuples only is on.
peter@localhost testdb=> SELECT second, first FROM my_table;
one,1
two,2
three,3
four,4
peter@localhost testdb=> \pset format unaligned
Output format is unaligned.
peter@localhost testdb=> \pset fieldsep '\t'
Field separator is " ".
peter@localhost testdb=> SELECT second, first FROM my_table;
one 1
two 2
three 3
four 4
بهعنوان روشی جایگزین، از دستورهای کوتاه استفاده کنید:
peter@localhost testdb=> \a \t \x Output format is aligned. Tuples only is off. Expanded display is on. peter@localhost testdb=> SELECT * FROM my_table; -[ RECORD 1 ]- first | 1 second | one -[ RECORD 2 ]- first | 2 second | two -[ RECORD 3 ]- first | 3 second | three -[ RECORD 4 ]- first | 4 second | four
همچنین، این گزینههای قالب خروجی را میتوان با استفاده از \g تنها برای یک پرسوجو تنظیم کرد:
peter@localhost testdb=> SELECT * FROM my_table peter@localhost testdb-> \g (format=aligned tuples_only=off expanded=on) -[ RECORD 1 ]- first | 1 second | one -[ RECORD 2 ]- first | 2 second | two -[ RECORD 3 ]- first | 3 second | three -[ RECORD 4 ]- first | 4 second | four
در اینجا مثالی از کاربرد دستور \df برای یافتن توابعی آمده است که نام آنها با int*pl مطابقت دارد و آرگومان دوم آنها از نوع bigint است:
testdb=> \df int*pl * bigint
List of functions
Schema | Name | Result data type | Argument data types | Type
------------+---------+------------------+---------------------+------
pg_catalog | int28pl | bigint | smallint, bigint | func
pg_catalog | int48pl | bigint | integer, bigint | func
pg_catalog | int8pl | bigint | bigint, bigint | func
(3 rows)
testdb=> \df+x int*pl integer bigint List of functions -[ RECORD 1 ]-------+----------------------------- Schema | pg_catalog Name | int48pl Result data type | bigint Argument data types | integer, bigint Type | func Volatility | immutable Parallel | safe Owner | postgres Security | invoker Leakproof? | no Access privileges | Language | internal Internal name | int48pl Description | implementation of + operator
در صورت مناسب بودن، نتایج پرسوجو را میتوان با دستور \crosstabview بهصورت نمای متقاطع (crosstab) نمایش داد:
testdb=> SELECT first, second, first > 2 AS gt2 FROM my_table;
first | second | gt2
-------+--------+-----
1 | one | f
2 | two | f
3 | three | t
4 | four | t
(4 rows)
testdb=> \crosstabview first second
first | one | two | three | four
-------+-----+-----+-------+------
1 | f | | |
2 | | f | |
3 | | | t |
4 | | | | t
(4 rows)
این مثال دوم یک جدول ضرب را نشان میدهد که در آن سطرها بر اساس ترتیب عددی معکوس مرتب شدهاند و ستونها دارای ترتیبی عددی، صعودی و مستقل هستند.
testdb=> SELECT t1.first as "A", t2.first+100 AS "B", t1.first*(t2.first+100) as "AxB", testdb-> row_number() over(order by t2.first) AS ord testdb-> FROM my_table t1 CROSS JOIN my_table t2 ORDER BY 1 DESC testdb-> \crosstabview "A" "B" "AxB" ord A | 101 | 102 | 103 | 104 ---+-----+-----+-----+----- 4 | 404 | 408 | 412 | 416 3 | 303 | 306 | 309 | 312 2 | 202 | 204 | 206 | 208 1 | 101 | 102 | 103 | 104 (4 rows)
| 2026 | PostgreSQL 18.6 |