أبحث عن معلومة دقيقة في قاعدة بيانات لا أعلم عنها.
إنه منتج تابع لجهة خارجية ، وهم بطيئون في الإجابة عن بعض الأسئلة ، وأنا أعلم أن البيانات تقع داخل هذا الديسيبل ، لذلك أريد أن أقوم ببعض الهندسة الرجعية.
بالنظر إلى جدول واحد ، هل من الممكن أن يكون لديك قائمة بأسماء أعمدة هذا الجدول؟
على سبيل المثال في SqlServer ، من الممكن تفريغ جدول في عبارات CREATE
قابلة لإعادة الاستخدام ، والتي تسرد جميع الأعمدة التي يتكون منها الجدول.
بالإضافة إلى سطر الأوامر \d+ <table_name>
وجدت بالفعل ، يمكنك أيضًا استخدام مخطط المعلومات للبحث عن بيانات العمود باستخدام information_schema.columns
:
SELECT *
FROM information_schema.columns
WHERE table_schema = 'your_schema'
AND table_name = 'your_table'
;
ملاحظة: وفقًا للمثال أعلاه ، تأكد من إحاطة القيم بعلامات اقتباس.
كمكمل للإجابات الأخرى ، حتى عبارة SELECT التي لا تُرجع أي صفوف ستكشف أسماء الأعمدة إليك ورمز التطبيق.
select *
from table_name
where false;
قد تلعب الأذونات مع أي من هذه الأساليب.
مخطط معلومات المعلومات هي الطريقة البطيئة والمضمونة: فهي موحدة وقابلة للنقل إلى حد كبير إلى قواعد البيانات الأخرى التي تدعمها. وستستمر في العمل عبر الإصدارات الرئيسية.
ومع ذلك ، غالبًا ما تنضم طرق العرض في مخطط المعلومات في العديد من الجداول من كتالوجات النظام لتلبية تنسيق موحد بصرامة - كثير منها مجرد شحنات ميتة معظم الوقت. هذا يجعلهم بطيئين .
لا يقدم مطورو Postgres وعودًا ، لكن الأساسيات (مثل ما هو مطلوب هنا) لن تتغير عبر الإصدارات الرئيسية.
psql
(واجهة سطر الأوامر الأصلية) تأخذ المسار السريع ، بالطبع ، وتستعلم المصدر مباشرة. إذا بدأت psql
بالمعلمة -E
، SQL وراء أوامر الخط المائل العكسي مثل \d
يتم عرض. أو \set ECHO_HIDDEN on
من سطر أوامر psql. بدءًا من هناك ، يمكنك إنشاء إجابة لسؤالك.
بالنظر إلى جدول واحد ، هل من الممكن أن يكون لديك قائمة بأسماء الأعمدة لهذا الجدول.
SELECT attrelid::regclass AS tbl
, attname AS col
, atttypid::regtype AS datatype
-- more attributes?
FROM pg_attribute
WHERE attrelid = 'myschema.mytable'::regclass -- table name, optionally schema-qualified
AND attnum > 0
AND NOT attisdropped
ORDER BY attnum;
أسرع من الاستعلام information_schema.columns
. محاولة EXPLAIN ANALYZE
لترى بنفسك. لا يزال مهمًا جدًا للبحث مرة واحدة. ولكن قد يحدث فرقًا إذا تم استخدامه في استعلام/دالة يتم تكرارها عدة مرات.
هناك أيضًا اختلافات طفيفة في الرؤية. مقارنة تفصيلية:
psql
على PostgreSQL 11+إذا كنت تبحث عن أنواع الأعمدة في طلب البحث ، فيمكنك استخدام psql
's \gdesc
SELECT
NULL AS zero,
1 AS one,
2.0 AS two,
'three' AS three,
$1 AS four,
sin($2) as five,
'foo'::varchar(4) as six,
CURRENT_DATE AS now
\gdesc
Column | Type
--------+----------------------
zero | text
one | integer
two | numeric
three | text
four | text
five | double precision
six | character varying(4)
now | date
(8 rows)
PostgreSQL فقط
هذا هوكي إلى حد ما ولكن يمكن أن يكون منافسًا إذا كنت تبحث عن أقصر SQL ممكن:
SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))
أو حتى أقصر (بافتراض وجود صف واحد على الأقل في الجدول)
SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))
القائمة تحافظ على الترتيب. في حال لم تكن مهتمًا بالطلب ولديك ملحق hstore
مثبت يمكنك القيام به أقصر
SELECT skeys(hstore(NULL::schema_name.table_name))