SQL، کیا آسان ہو سکتا ہے؟ ہم میں سے ہر ایک سادہ درخواست لکھ سکتا ہے - ہم ٹائپ کرتے ہیں۔ منتخب، پھر مطلوبہ کالموں کی فہرست بنائیں سےٹیبل کا نام، کچھ شرائط میں کہاں اور بس اتنا ہے - مفید ڈیٹا ہماری جیب میں ہے، اور (تقریباً) اس بات سے قطع نظر کہ اس وقت ڈی بی ایم ایس کس کے زیر اثر ہے (یا شاید
اور آئیے شروع کرتے ہیں۔
آبجیکٹ-ریلیشنل میپنگ
ORM کے حامی روایتی طور پر رفتار اور ترقی میں آسانی، DBMS سے آزادی اور کلین کوڈ کو اہمیت دیتے ہیں۔ ہم میں سے بہت سے لوگوں کے لیے، ڈیٹا بیس کے ساتھ کام کرنے کا کوڈ (اور اکثر خود ڈیٹا بیس)
یہ عام طور پر کچھ ایسا لگتا ہے...
@Entity
@Table(name = "stock", catalog = "maindb", uniqueConstraints = {
@UniqueConstraint(columnNames = "STOCK_NAME"),
@UniqueConstraint(columnNames = "STOCK_CODE") })
public class Stock implements java.io.Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "STOCK_ID", unique = true, nullable = false)
public Integer getStockId() {
return this.stockId;
}
...
ماڈل کو ہوشیار تشریحات کے ساتھ لٹکا دیا گیا ہے، اور کہیں کہیں پردے کے پیچھے ایک بہادر ORM کچھ ایس کیو ایل کوڈ تیار کرتا ہے اور اس پر عمل درآمد کرتا ہے۔ ویسے، ڈویلپرز اپنے ڈیٹا بیس سے خود کو کلومیٹر کے تجرید کے ساتھ الگ تھلگ کرنے کی پوری کوشش کر رہے ہیں، جو کچھ اشارہ کرتا ہے۔
رکاوٹوں کے دوسری طرف، خالص "ہاتھ سے بنے" SQL کے پیروکار اضافی تہوں اور تجریدوں کے بغیر اپنے DBMS سے تمام رس نچوڑ لینے کی صلاحیت کو نوٹ کرتے ہیں۔ نتیجے کے طور پر، "ڈیٹا سینٹرک" پروجیکٹس ظاہر ہوتے ہیں، جہاں خاص طور پر تربیت یافتہ لوگ ڈیٹا بیس میں شامل ہوتے ہیں (وہ "بنیاد پرست" بھی ہوتے ہیں، وہ "بنیاد پرست" بھی ہوتے ہیں، وہ "باسڈینرز" وغیرہ بھی ہوتے ہیں)، اور ڈویلپر تفصیلات میں جانے کے بغیر، صرف تیار شدہ خیالات اور ذخیرہ شدہ طریقہ کار کو "کھینچنا" ہے۔
کیا ہوگا اگر ہمارے پاس دونوں جہانوں میں سے بہترین ہو؟ یہ زندگی کی تصدیق کرنے والے نام کے ساتھ ایک حیرت انگیز ٹول میں کیسے کیا جاتا ہے۔
Clojure DSLs بنانے کے لیے ایک عمدہ زبان ہے، لیکن SQL بذات خود ایک ٹھنڈا DSL ہے، اور ہمیں کسی اور کی ضرورت نہیں ہے۔ ایس ایکسپریشنز بہت اچھے ہیں، لیکن وہ یہاں کوئی نئی چیز شامل نہیں کرتے ہیں۔ نتیجے کے طور پر، ہمیں بریکٹ کی خاطر بریکٹ ملتے ہیں۔ اتفاق نہیں کرتا؟ پھر اس لمحے کا انتظار کریں جب ڈیٹا بیس پر خلاصہ لیک ہونا شروع ہوجائے اور آپ فنکشن سے لڑنا شروع کردیں۔ (raw-sql)
تو مجھے کیا کرنا چاھیے؟ آئیے ایس کیو ایل کو باقاعدہ ایس کیو ایل کے طور پر چھوڑ دیں - فی درخواست ایک فائل:
-- name: users-by-country
select *
from users
where country_code = :country_code
... اور پھر اس فائل کو پڑھیں، اسے باقاعدہ Clojure فنکشن میں تبدیل کرتے ہوئے:
(defqueries "some/where/users_by_country.sql"
{:connection db-spec})
;;; A function with the name `users-by-country` has been created.
;;; Let's use it:
(users-by-country {:country_code "GB"})
;=> ({:name "Kris" :country_code "GB" ...} ...)
"خود ہی سے ایس کیو ایل، خود سے کلوجور" اصول پر عمل کرتے ہوئے، آپ کو ملتا ہے:
- کوئی نحوی حیرت نہیں۔ آپ کا ڈیٹا بیس (کسی دوسرے کی طرح) ایس کیو ایل کے معیار کے مطابق 100٪ نہیں ہے - لیکن اس سے Yesql کے لیے کوئی فرق نہیں پڑتا۔ آپ SQL مساوی نحو کے ساتھ فنکشنز کی تلاش میں وقت ضائع نہیں کریں گے۔ آپ کو کبھی بھی کسی فنکشن میں واپس نہیں جانا پڑے گا۔ (raw-sql "some('funky'::SYNTAX)")).
- بہترین ایڈیٹر سپورٹ۔ آپ کے ایڈیٹر کو پہلے ہی بہترین SQL سپورٹ حاصل ہے۔ ایس کیو ایل کو بطور SQL محفوظ کرکے آپ اسے آسانی سے استعمال کرسکتے ہیں۔
- ٹیم کی مطابقت۔ آپ کے DBAs وہ SQL پڑھ اور لکھ سکتے ہیں جسے آپ اپنے Clojure پروجیکٹ میں استعمال کرتے ہیں۔
- آسان کارکردگی ٹیوننگ. ایک مشکل سوال کے لیے ایک منصوبہ بنانے کی ضرورت ہے؟ جب آپ کا استفسار باقاعدہ SQL ہے تو یہ کوئی مسئلہ نہیں ہے۔
- استفسارات کو دوبارہ استعمال کرنا۔ ان ہی SQL فائلوں کو دوسرے پروجیکٹس میں گھسیٹیں اور چھوڑیں کیونکہ یہ بالکل سادہ پرانا SQL ہے - بس اسے شیئر کریں۔
میری رائے میں، خیال بہت ٹھنڈا ہے اور ایک ہی وقت میں بہت آسان ہے، جس کی بدولت اس منصوبے کو بہت کچھ حاصل ہوا ہے۔
IDE اور DB مینیجرز
آئیے ایک آسان روزمرہ کے کام سے شروع کرتے ہیں۔ اکثر ہمیں ڈیٹا بیس میں کچھ اشیاء تلاش کرنا پڑتی ہیں، مثال کے طور پر، اسکیما میں ایک ٹیبل تلاش کرنا اور اس کی ساخت کا مطالعہ کرنا پڑتا ہے (کون سے کالم، کیز، انڈیکس، رکاوٹیں وغیرہ استعمال ہوتے ہیں)۔ اور کسی بھی گرافیکل IDE یا چھوٹے DB-مینیجر سے، سب سے پہلے، ہم بالکل ان صلاحیتوں کی توقع کرتے ہیں۔ تاکہ یہ تیز ہو اور آپ کو آدھے گھنٹے تک انتظار نہیں کرنا پڑے گا جب تک کہ ضروری معلومات والی ونڈو تیار نہ ہو جائے (خاص طور پر ریموٹ ڈیٹا بیس سے سست روابط کے ساتھ)، اور ساتھ ہی، موصول ہونے والی معلومات تازہ اور متعلقہ ہوں، اور کیش شدہ ردی نہیں۔ مزید یہ کہ ڈیٹا بیس جتنا زیادہ پیچیدہ اور بڑا ہوگا اور ان کی تعداد جتنی زیادہ ہوگی، یہ کرنا اتنا ہی مشکل ہوگا۔
لیکن عام طور پر میں ماؤس کو پھینک دیتا ہوں اور صرف کوڈ لکھتا ہوں۔ ہم کہتے ہیں کہ آپ کو یہ معلوم کرنے کی ضرورت ہے کہ "HR" اسکیما میں کون سی میزیں (اور کن خصوصیات کے ساتھ) موجود ہیں۔ زیادہ تر DBMSs میں، معلومات_schema سے اس سادہ سوال کے ساتھ مطلوبہ نتیجہ حاصل کیا جا سکتا ہے:
select table_name
, ...
from information_schema.tables
where schema = 'HR'
ڈیٹا بیس سے ڈیٹا بیس تک، اس طرح کے حوالہ جات کے مواد ہر DBMS کی صلاحیتوں کے لحاظ سے مختلف ہوتے ہیں۔ اور، مثال کے طور پر، MySQL کے لیے، اسی حوالہ کتاب سے آپ اس DBMS کے لیے مخصوص ٹیبل پیرامیٹرز حاصل کر سکتے ہیں:
select table_name
, storage_engine -- Используемый "движок" ("MyISAM", "InnoDB" etc)
, row_format -- Формат строки ("Fixed", "Dynamic" etc)
, ...
from information_schema.tables
where schema = 'HR'
اوریکل معلومات_سکیما نہیں جانتا ہے، لیکن اس کے پاس ہے
select table_name
, pct_free -- Минимум свободного места в блоке данных (%)
, pct_used -- Минимум используемого места в блоке данных (%)
, last_analyzed -- Дата последнего сбора статистики
, ...
from all_tables
where owner = 'HR'
کلک ہاؤس کوئی استثنا نہیں ہے:
select name
, engine -- Используемый "движок" ("MergeTree", "Dictionary" etc)
, ...
from system.tables
where database = 'HR'
ایسا ہی کچھ کیسنڈرا میں کیا جا سکتا ہے (جس میں ٹیبلز کے بجائے کالم فیملیز اور اسکیموں کی بجائے کلیدی جگہیں ہیں):
select columnfamily_name
, compaction_strategy_class -- Стратегия сборки мусора
, gc_grace_seconds -- Время жизни мусора
, ...
from system.schema_columnfamilies
where keyspace_name = 'HR'
زیادہ تر دوسرے ڈیٹا بیس کے لیے، آپ اسی طرح کے سوالات کے ساتھ بھی آ سکتے ہیں (یہاں تک کہ مونگو کے پاس بھی ہے۔
بلاشبہ، اس طرح آپ نہ صرف میزوں کے بارے میں، بلکہ عام طور پر کسی بھی چیز کے بارے میں معلومات حاصل کر سکتے ہیں۔ وقتاً فوقتاً، مہربان لوگ مختلف ڈیٹا بیس کے لیے اس طرح کے کوڈ کا اشتراک کرتے ہیں، جیسا کہ، مثال کے طور پر، ہابرا آرٹیکلز کی سیریز میں "پوسٹگری ایس کیو ایل ڈیٹا بیسز کو دستاویز کرنے کے لیے کام" (
نتیجے کے طور پر، اشیاء کو تلاش کرنے اور تلاش کرنے کا یہ طریقہ بہت زیادہ لچکدار ہے، بہت زیادہ وقت بچاتا ہے، اور آپ کو بالکل وہی معلومات حاصل کرنے کی اجازت دیتا ہے جس شکل میں یہ اب ضروری ہے (جیسا کہ، مثال کے طور پر، پوسٹ میں بیان کیا گیا ہے)
اشیاء کے ساتھ آپریشنز
ضروری اشیاء تلاش کرنے اور ان کا مطالعہ کرنے کے بعد، ان کے ساتھ کچھ مفید کام کرنے کا وقت آگیا ہے۔ قدرتی طور پر، کی بورڈ سے اپنی انگلیاں اتارے بغیر بھی۔
یہ کوئی راز نہیں ہے کہ صرف ٹیبل کو حذف کرنا تقریبا تمام ڈیٹا بیس میں ایک جیسا نظر آئے گا۔
drop table hr.persons
لیکن میز کی تخلیق کے ساتھ یہ زیادہ دلچسپ ہو جاتا ہے. تقریباً کوئی بھی DBMS (بشمول بہت سے NoSQL) کسی نہ کسی شکل میں "ٹیبل بنا سکتا ہے"، اور اس کا مرکزی حصہ بھی تھوڑا سا مختلف ہوگا (نام، کالموں کی فہرست، ڈیٹا کی اقسام)، لیکن دیگر تفصیلات ڈرامائی طور پر مختلف ہو سکتی ہیں اور اس پر منحصر ہیں۔ اندرونی ڈیوائس اور مخصوص DBMS کی صلاحیتیں۔ میری پسندیدہ مثال یہ ہے کہ اوریکل دستاویزات میں "ٹیبل بنائیں" نحو کے لیے صرف "ننگے" BNFs ہیں۔
نیز، بہت سے DBMSs کی اپنی مخصوص قسم کی اشیاء ہوتی ہیں جو دوسرے DBMSs میں دستیاب نہیں ہوتی ہیں۔ مزید برآں، ہم نہ صرف ڈیٹابیس اشیاء پر بلکہ خود DBMS پر بھی آپریشن کر سکتے ہیں، مثال کے طور پر، کسی عمل کو "قتل" کرنا، کچھ میموری ایریا خالی کرنا، ٹریسنگ کو فعال کرنا، "صرف پڑھنے" موڈ پر سوئچ کرنا، اور بہت کچھ۔
اب تھوڑا ڈرا کرتے ہیں۔
سب سے عام کاموں میں سے ایک ڈیٹابیس آبجیکٹ کے ساتھ ایک خاکہ بنانا اور اشیاء اور ان کے درمیان کنکشن کو ایک خوبصورت تصویر میں دیکھنا ہے۔ تقریباً کوئی بھی گرافیکل IDE، علیحدہ "کمانڈ لائن" یوٹیلیٹیز، خصوصی گرافیکل ٹولز اور ماڈلرز ایسا کر سکتے ہیں۔ وہ آپ کے لیے "جتنا بہتر وہ کر سکتے ہیں" کچھ کھینچیں گے، اور آپ اس عمل کو صرف کنفیگریشن فائل میں چند پیرامیٹرز یا انٹرفیس میں چیک باکسز کی مدد سے تھوڑا سا متاثر کر سکتے ہیں۔
لیکن یہ مسئلہ بہت آسان، زیادہ لچکدار اور خوبصورت اور یقیناً کوڈ کی مدد سے حل کیا جا سکتا ہے۔ کسی بھی پیچیدگی کے خاکے بنانے کے لیے، ہمارے پاس متعدد مخصوص مارک اپ لینگوئجز (DOT، GraphML وغیرہ) ہیں، اور ان کے لیے ایپلی کیشنز (GraphViz، PlantUML، Mermaid) کی ایک مکمل بکھری ہوئی ہے جو اس طرح کی ہدایات کو پڑھ سکتی ہے اور انہیں مختلف فارمیٹس میں دیکھ سکتی ہے۔ . ٹھیک ہے، ہم پہلے ہی جانتے ہیں کہ اشیاء اور ان کے درمیان کنکشن کے بارے میں معلومات کیسے حاصل کی جاتی ہیں۔
پلانٹ یو ایم ایل اور استعمال کرتے ہوئے یہ کیسا نظر آسکتا ہے اس کی ایک چھوٹی سی مثال یہ ہے۔
select '@startuml'||chr(10)||'hide methods'||chr(10)||'hide stereotypes' union all
select distinct ccu.table_name || ' --|> ' ||
tc.table_name as val
from table_constraints as tc
join key_column_usage as kcu
on tc.constraint_name = kcu.constraint_name
join constraint_column_usage as ccu
on ccu.constraint_name = tc.constraint_name
where tc.constraint_type = 'FOREIGN KEY'
and tc.table_name ~ '.*' union all
select '@enduml'
اور اگر آپ تھوڑی سی کوشش کریں تو اس کی بنیاد پر
ایس کیو ایل کا استفسار کچھ زیادہ ہی پیچیدہ ہے۔
-- Шапка
select '@startuml
!define Table(name,desc) class name as "desc" << (T,#FFAAAA) >>
!define primary_key(x) <b>x</b>
!define unique(x) <color:green>x</color>
!define not_null(x) <u>x</u>
hide methods
hide stereotypes'
union all
-- Таблицы
select format('Table(%s, "%s n information about %s") {'||chr(10), table_name, table_name, table_name) ||
(select string_agg(column_name || ' ' || upper(udt_name), chr(10))
from information_schema.columns
where table_schema = 'public'
and table_name = t.table_name) || chr(10) || '}'
from information_schema.tables t
where table_schema = 'public'
union all
-- Связи между таблицами
select distinct ccu.table_name || ' "1" --> "0..N" ' || tc.table_name || format(' : "A %s may haven many %s"', ccu.table_name, tc.table_name)
from information_schema.table_constraints as tc
join information_schema.key_column_usage as kcu on tc.constraint_name = kcu.constraint_name
join information_schema.constraint_column_usage as ccu on ccu.constraint_name = tc.constraint_name
where tc.constraint_type = 'FOREIGN KEY'
and ccu.constraint_schema = 'public'
and tc.table_name ~ '.*'
union all
-- Подвал
select '@enduml'
اگر آپ قریب سے دیکھیں تو بہت سے ویژولائزیشن ٹولز بھی اسی طرح کے سوالات کا استعمال کرتے ہیں۔ سچ ہے، یہ درخواستیں عام طور پر گہرائی سے ہوتی ہیں۔
میٹرکس اور نگرانی
آئیے ایک روایتی طور پر پیچیدہ موضوع پر چلتے ہیں - ڈیٹا بیس کی کارکردگی کی نگرانی۔ مجھے ایک چھوٹی سی سچی کہانی یاد ہے جو مجھے "میرے ایک دوست" نے سنائی تھی۔ ایک اور پروجیکٹ پر ایک خاص طاقتور DBA رہتا تھا، اور ڈویلپرز میں سے کچھ اسے ذاتی طور پر جانتے تھے، یا کبھی اسے ذاتی طور پر دیکھا تھا (اس حقیقت کے باوجود کہ، افواہوں کے مطابق، اس نے اگلی عمارت میں کہیں کام کیا تھا)۔ گھنٹہ "X" پر، جب ایک بڑے خوردہ فروش کا پوڈکشن سسٹم ایک بار پھر "برا محسوس کرنے" لگا، تو اس نے خاموشی سے اوریکل انٹرپرائز مینیجر سے گراف کے اسکرین شاٹس بھیجے، جس پر اس نے "فہم" کے لیے سرخ مارکر کے ساتھ اہم جگہوں کو احتیاط سے اجاگر کیا۔ اس کو ہلکے سے کہیں، زیادہ مدد نہیں ملی)۔ اور اس "فوٹو کارڈ" کی بنیاد پر مجھے علاج کرنا پڑا۔ ایک ہی وقت میں، کسی کو قیمتی (لفظ کے دونوں معنوں میں) انٹرپرائز مینیجر تک رسائی نہیں تھی، کیونکہ نظام پیچیدہ اور مہنگا ہے، اچانک "ڈویلپر کسی چیز سے ٹھوکر کھاتے ہیں اور سب کچھ توڑ دیتے ہیں۔" لہذا، ڈویلپرز نے "تجرباتی طور پر" بریکوں کی جگہ اور وجہ کا پتہ لگایا اور ایک پیچ جاری کیا۔ اگر مستقبل قریب میں ڈی بی اے کی طرف سے خطرناک خط دوبارہ نہ آیا، تو ہر کوئی سکون کی سانس لے گا اور اپنے موجودہ کاموں پر واپس آ جائے گا (نئے خط تک)۔
لیکن نگرانی کا عمل زیادہ پرلطف اور دوستانہ، اور سب سے اہم بات، ہر کسی کے لیے قابل رسائی اور شفاف نظر آتا ہے۔ کم از کم اس کا بنیادی حصہ، مرکزی نگرانی کے نظام میں اضافے کے طور پر (جو یقیناً مفید اور بہت سے معاملات میں ناقابل تلافی ہیں)۔ کوئی بھی DBMS اپنی موجودہ حالت اور کارکردگی کے بارے میں معلومات بانٹنے کے لیے آزادانہ اور بالکل مفت ہے۔ اسی "خونی" اوریکل ڈی بی میں، کارکردگی کے بارے میں تقریباً کوئی بھی معلومات سسٹم ویوز سے حاصل کی جا سکتی ہیں، جس میں عمل اور سیشنز سے لے کر بفر کیش کی حالت تک (مثال کے طور پر،
اس طرح، کسی قسم کے میٹرکس کلیکٹر (ٹیلی گراف، میٹرک بیٹ، جمع) سے لیس جو حسب ضرورت sql سوالات کر سکتے ہیں، ان میٹرکس کا ذخیرہ (InfluxDB، Elasticsearch، Timescaledb) اور ایک visualizer (Grafana، Kibana)، آپ کافی آسانی سے حاصل کر سکتے ہیں۔ اور ایک لچکدار نگرانی کا نظام جو نظام کے وسیع پیمانے پر دیگر میٹرکس کے ساتھ قریب سے مربوط ہو گا (مثلاً ایپلیکیشن سرور سے، OS سے، وغیرہ)۔ جیسا کہ، مثال کے طور پر، یہ pgwatch2 میں کیا جاتا ہے، جو InfluxDB + Grafana مجموعہ اور سسٹم ویوز کے لیے سوالات کا ایک سیٹ استعمال کرتا ہے، جس تک رسائی بھی کی جا سکتی ہے۔
مجموعی طور پر
اور یہ صرف ایک تخمینی فہرست ہے جو ہمارے ڈیٹا بیس کے ساتھ باقاعدہ ایس کیو ایل کوڈ کا استعمال کرتے ہوئے کیا جا سکتا ہے۔ مجھے یقین ہے کہ آپ کو اور بھی بہت سے استعمال مل سکتے ہیں، تبصرے میں لکھیں۔ اور ہم اس کے بارے میں بات کریں گے کہ کس طرح (اور سب سے اہم بات یہ ہے کہ) ان سب کو خودکار کیا جائے اور اسے اگلی بار اپنی CI/CD پائپ لائن میں شامل کریں۔
ماخذ: www.habr.com