پانڈوں میں ایس کیو ایل فائلوں کو پڑھنا اور لکھنا

پانڈوں میں ایس کیو ایل فائلوں کو پڑھنا اور لکھنا

جب میں نے کچھ سال پہلے ڈیٹا اینالیسس سیکھنا شروع کیا تو سب سے پہلی چیز جو میں نے سیکھی وہ SQL اور Pandas تھے۔ ڈیٹا تجزیہ کار کے طور پر، SQL اور پانڈوں کے ساتھ کام کرنے میں مضبوط بنیاد کا ہونا بہت ضروری ہے۔ دونوں طاقتور ٹولز ہیں جو ڈیٹا کے تجزیہ کاروں کو ڈیٹا بیس میں ذخیرہ شدہ ڈیٹا کا مؤثر طریقے سے تجزیہ اور ہیرا پھیری کرنے میں مدد کرتے ہیں۔

ایس کیو ایل اور پانڈوں کا جائزہ

ایس کیو ایل (سٹرکچرڈ کوئوری لینگویج) ایک پروگرامنگ لینگویج ہے جو رشتہ دار ڈیٹا بیس کو منظم کرنے اور ان میں ہیرا پھیری کے لیے استعمال ہوتی ہے۔ دوسری طرف، پانڈاس ایک ازگر کی لائبریری ہے جو ڈیٹا کی ہیرا پھیری اور تجزیہ کے لیے استعمال ہوتی ہے۔

ڈیٹا تجزیہ میں بڑی مقدار میں ڈیٹا کے ساتھ کام کرنا شامل ہے، اور ڈیٹا بیس اکثر اس ڈیٹا کو ذخیرہ کرنے کے لیے استعمال ہوتے ہیں۔ SQL اور Pandas ڈیٹا بیس کے ساتھ کام کرنے کے لیے طاقتور ٹولز فراہم کرتے ہیں، جس سے ڈیٹا تجزیہ کاروں کو ڈیٹا کو مؤثر طریقے سے نکالنے، ہیرا پھیری کرنے اور تجزیہ کرنے کی اجازت ملتی ہے۔ ان ٹولز کا فائدہ اٹھا کر، ڈیٹا تجزیہ کار ڈیٹا سے قیمتی بصیرت حاصل کر سکتے ہیں جو دوسری صورت میں حاصل کرنا مشکل ہو گا۔

اس مضمون میں، ہم دریافت کریں گے کہ ڈیٹا بیس کو پڑھنے اور لکھنے کے لیے SQL اور Pandas کو کیسے استعمال کیا جائے۔

DB سے جڑ رہا ہے۔

لائبریریوں کی تنصیب

اس سے پہلے کہ ہم پانڈوں کے ساتھ ایس کیو ایل ڈیٹا بیس سے منسلک ہو سکیں ہمیں پہلے ضروری لائبریریوں کو انسٹال کرنا چاہیے۔ دو اہم لائبریریوں کی ضرورت ہے پانڈاس اور SQLAlchemy۔ پانڈاس ایک مشہور ڈیٹا ہیرا پھیری لائبریری ہے جو بڑے ڈیٹا ڈھانچے کو ذخیرہ کرنے کی اجازت دیتی ہے، جیسا کہ تعارف میں بتایا گیا ہے۔ اس کے برعکس، SQLAlchemy SQL ڈیٹا بیس سے منسلک ہونے اور اس کے ساتھ تعامل کرنے کے لیے ایک API فراہم کرتا ہے۔

ہم کمانڈ پرامپٹ پر درج ذیل کمانڈز چلا کر Python پیکیج مینیجر، pip کا استعمال کرتے ہوئے دونوں لائبریریوں کو انسٹال کر سکتے ہیں۔

$ pip install pandas
$ pip install sqlalchemy

رابطہ قائم کرنا

لائبریریوں کے انسٹال ہونے کے ساتھ، اب ہم ایس کیو ایل ڈیٹا بیس سے منسلک ہونے کے لیے پانڈوں کا استعمال کر سکتے ہیں۔

شروع کرنے کے لیے، ہم اس کے ساتھ ایک SQLAlchemy انجن آبجیکٹ بنائیں گے۔ create_engine(). create_engine() فنکشن Python کوڈ کو ڈیٹا بیس سے جوڑتا ہے۔ یہ ایک دلیل کے طور پر کنکشن سٹرنگ لیتا ہے جو ڈیٹا بیس کی قسم اور کنکشن کی تفصیلات بتاتا ہے۔ اس مثال میں، ہم SQLite ڈیٹا بیس کی قسم اور ڈیٹا بیس فائل کا راستہ استعمال کریں گے۔

ذیل کی مثال کا استعمال کرتے ہوئے SQLite ڈیٹا بیس کے لیے ایک انجن آبجیکٹ بنائیں:

import pandas as pd
from sqlalchemy import create_engine engine = create_engine('sqlite:///C/SQLite/student.db')

اگر SQLite ڈیٹا بیس فائل، student.db ہمارے معاملے میں، اسی ڈائرکٹری میں ہے جس میں Python اسکرپٹ ہے، تو ہم فائل کا نام براہ راست استعمال کر سکتے ہیں، جیسا کہ ذیل میں دکھایا گیا ہے۔

engine = create_engine('sqlite:///student.db')

پانڈوں کے ساتھ ایس کیو ایل فائلیں پڑھنا

آئیے اب ڈیٹا پڑھیں کہ ہم نے ایک کنکشن قائم کر لیا ہے۔ اس سیکشن میں، ہم دیکھیں گے read_sql, read_sql_table، اور read_sql_query افعال اور ڈیٹا بیس کے ساتھ کام کرنے کے لیے ان کا استعمال کیسے کریں۔

پانڈا کا استعمال کرتے ہوئے ایس کیو ایل کے سوالات کو انجام دینا read_sql() فنکشن

۔ read_sql() ایک پانڈاس لائبریری فنکشن ہے جو ہمیں ایک SQL استفسار پر عمل کرنے اور نتائج کو پانڈاس ڈیٹا فریم میں بازیافت کرنے کی اجازت دیتا ہے۔ دی read_sql() فنکشن SQL اور Python کو جوڑتا ہے، جس سے ہمیں دونوں زبانوں کی طاقت سے فائدہ اٹھانے کی اجازت ملتی ہے۔ فنکشن لپیٹتا ہے۔ read_sql_table() اور read_sql_query(). read_sql() فنکشن کو فراہم کردہ ان پٹ کی بنیاد پر اندرونی طور پر روٹ کیا جاتا ہے، جس کا مطلب یہ ہے کہ اگر ان پٹ کو ایس کیو ایل استفسار پر عمل کرنا ہے، تو اسے روٹ کیا جائے گا۔ read_sql_query()، اور اگر یہ ڈیٹا بیس ٹیبل ہے، تو اسے روٹ کیا جائے گا۔ read_sql_table().

۔ read_sql() نحو درج ذیل ہے:

pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)

SQL اور con پیرامیٹرز کی ضرورت ہے؛ باقی اختیاری ہیں. تاہم، ہم ان اختیاری پیرامیٹرز کا استعمال کرتے ہوئے نتیجہ میں ہیرا پھیری کر سکتے ہیں۔ آئیے ہر پیرامیٹر پر گہری نظر ڈالیں۔

  • sql: SQL استفسار یا ڈیٹا بیس ٹیبل کا نام
  • con: کنکشن آبجیکٹ یا کنکشن URL
  • index_col: یہ پیرامیٹر ہمیں ڈیٹا فریم انڈیکس کے بطور SQL استفسار کے نتیجے سے ایک یا زیادہ کالم استعمال کرنے کی اجازت دیتا ہے۔ یہ یا تو ایک کالم یا کالموں کی فہرست لے سکتا ہے۔
  • coerce_float: یہ پیرامیٹر بتاتا ہے کہ آیا غیر عددی اقدار کو فلوٹنگ نمبرز میں تبدیل کیا جانا چاہیے یا سٹرنگ کے طور پر چھوڑ دیا جانا چاہیے۔ یہ بطور ڈیفالٹ درست پر سیٹ ہے۔ اگر ممکن ہو تو، یہ غیر عددی اقدار کو فلوٹ اقسام میں تبدیل کرتا ہے۔
  • params: پیرامز ایس کیو ایل کے استفسار پر متحرک اقدار کو منتقل کرنے کا ایک محفوظ طریقہ فراہم کرتے ہیں۔ ہم ایک لغت، ٹوپل، یا فہرست کو منتقل کرنے کے لیے پیرامز پیرامیٹر استعمال کر سکتے ہیں۔ ڈیٹا بیس پر منحصر ہے، پیرامز کا نحو مختلف ہوتا ہے۔
  • parse_dates: یہ ہمیں یہ بتانے کی اجازت دیتا ہے کہ نتیجے میں ڈیٹا فریم میں کون سا کالم تاریخ کے طور پر سمجھا جائے گا۔ یہ ایک کالم، کالموں کی فہرست، یا کالم کے نام کے طور پر کلید کے ساتھ اور کالم کی شکل کے طور پر قدر کو قبول کرتا ہے۔
  • columns: یہ ہمیں فہرست سے صرف منتخب کالم لانے کی اجازت دیتا ہے۔
  • chunksize: بڑے ڈیٹا سیٹ کے ساتھ کام کرتے وقت، chunksize اہم ہے۔ یہ استفسار کے نتیجے کو چھوٹے حصوں میں بازیافت کرتا ہے، کارکردگی کو بڑھاتا ہے۔

یہاں استعمال کرنے کے طریقے کی ایک مثال ہے۔ read_sql():

کا کوڈ:

import pandas as pd
from sqlalchemy import create_engine engine = create_engine('sqlite:///C/SQLite/student.db') df = pd.read_sql("SELECT * FROM Student", engine, index_col='Roll Number', parse_dates='dateOfBirth')
print(df)
print("The Data type of dateOfBirth: ", df.dateOfBirth.dtype) engine.dispose()

: پیداوار

 firstName lastName email dateOfBirth
rollNumber
1 Mark Simson  2000-02-23
2 Peter Griffen  2001-04-15
3 Meg Aniston  2001-09-20
Date type of dateOfBirth: datetime64[ns]

ڈیٹا بیس سے منسلک ہونے کے بعد، ہم ایک استفسار پر عمل کرتے ہیں جو سے تمام ریکارڈ واپس کرتا ہے۔ Student ٹیبل اور ڈیٹا فریم میں اسٹور کرتا ہے۔ df. "رول نمبر" کالم کو استعمال کرتے ہوئے انڈیکس میں تبدیل کیا جاتا ہے۔ index_col پیرامیٹر، اور "dateOfBirth" ڈیٹا ٹائپ ہے "datetime64[ns]" کی وجہ سے parse_dates. ہم استعمال کرسکتے ہیں read_sql() نہ صرف ڈیٹا کو بازیافت کرنے کے لیے بلکہ دیگر آپریشنز جیسے داخل کرنے، حذف کرنے اور اپ ڈیٹ کرنے کے لیے بھی۔ read_sql() ایک عام تقریب ہے.

DB سے مخصوص میزیں یا نظارے لوڈ ہو رہے ہیں۔

پانڈوں کے ساتھ ایک مخصوص ٹیبل یا منظر لوڈ کرنا read_sql_table() ڈیٹا بیس سے ڈیٹا کو پانڈاس ڈیٹا فریم میں پڑھنے کی ایک اور تکنیک ہے۔

کیا ہے پڑھیں_ایس کیو ایل_ٹیبل?

پانڈاس لائبریری فراہم کرتی ہے۔ read_sql_table فنکشن، جو خاص طور پر کسی بھی سوالات پر عمل کیے بغیر پورے ایس کیو ایل ٹیبل کو پڑھنے اور پانڈاس ڈیٹا فریم کے طور پر نتیجہ واپس کرنے کے لیے ڈیزائن کیا گیا ہے۔

کا نحو read_sql_table() ذیل میں ہے:

pandas.read_sql_table(table_name, con, schema=None, index_col=None, coerce_float=True, parse_dates=None, columns=None, chunksize=None)

سوائے اس کے table_name اور اسکیما، پیرامیٹرز کی وضاحت اسی طرح کی گئی ہے۔ read_sql().

  • table_name: پیرامیٹر table_name ڈیٹا بیس میں SQL ٹیبل کا نام ہے۔
  • schema: یہ اختیاری پیرامیٹر اسکیما کا نام ہے جس میں ٹیبل کا نام ہے۔

ڈیٹا بیس سے کنکشن بنانے کے بعد، ہم استعمال کریں گے۔ read_sql_table لوڈ کرنے کی تقریب Student پانڈاس ڈیٹا فریم میں ٹیبل۔

import pandas as pd
from sqlalchemy import create_engine engine = create_engine('sqlite:///C/SQLite/student.db') df = pd.read_sql_table('Student', engine)
print(df.head()) engine.dispose()

: پیداوار

 rollNumber firstName lastName email dateOfBirth
0 1 Mark Simson  2000-02-23
1 2 Peter Griffen  2001-04-15
2 3 Meg Aniston  2001-09-20

ہم فرض کریں گے کہ یہ ایک بڑی میز ہے جو میموری سے بھرپور ہوسکتی ہے۔ آئیے دریافت کریں کہ ہم کس طرح استعمال کر سکتے ہیں۔ chunksize اس مسئلے کو حل کرنے کے لیے پیرامیٹر۔

بہترین طرز عمل، صنعت کے لیے منظور شدہ معیارات، اور چیٹ شیٹ کے ساتھ Git سیکھنے کے لیے ہمارے ہینڈ آن، عملی گائیڈ کو دیکھیں۔ گوگلنگ گٹ کمانڈز کو روکیں اور اصل میں سیکھ یہ!

کا کوڈ:

import pandas as pd
from sqlalchemy import create_engine engine = create_engine('sqlite:///C/SQLite/student.db') df_iterator = pd.read_sql_table('Student', engine, chunksize = 1) for df in df_iterator: print(df.head()) engine.dispose()

: پیداوار

 rollNumber firstName lastName email dateOfBirth
0 1 Mark Simson  2000-02-23
0 2 Peter Griffen  2001-04-15
0 3 Meg Aniston  2001-09-20

براہ کرم ذہن میں رکھیں کہ chunksize میں یہاں 1 استعمال کر رہا ہوں کیونکہ میرے ٹیبل میں صرف 3 ریکارڈز ہیں۔

پانڈوں کے ایس کیو ایل نحو کے ساتھ براہ راست ڈی بی سے استفسار کرنا

ڈیٹا بیس سے بصیرت نکالنا ڈیٹا تجزیہ کاروں اور سائنسدانوں کے لیے ایک اہم حصہ ہے۔ ایسا کرنے کے لیے، ہم فائدہ اٹھائیں گے۔ read_sql_query() تقریب.

read_sql_query() کیا ہے؟

پانڈوں کا استعمال read_sql_query() فنکشن، ہم SQL سوالات چلا سکتے ہیں اور نتائج کو براہ راست ڈیٹا فریم میں حاصل کر سکتے ہیں۔ دی read_sql_query() فنکشن خاص طور پر کے لیے بنایا گیا ہے۔ SELECT بیانات اسے کسی دوسرے کام کے لیے استعمال نہیں کیا جا سکتا، جیسے DELETE or UPDATE.

مطابقت رکھتا ہے:

pandas.read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=None, dtype=None, dtype_backend=_NoDefault.no_default)

تمام پیرامیٹر کی تفصیل ایک جیسی ہے۔ read_sql() فنکشن یہاں کی ایک مثال ہے read_sql_query():

کا کوڈ:

import pandas as pd
from sqlalchemy import create_engine engine = create_engine('sqlite:///C/SQLite/student.db') df = pd.read_sql_query('Select firstName, lastName From Student Where rollNumber = 1', engine)
print(df) engine.dispose()

: پیداوار

 firstName lastName
0 Mark Simson

پانڈوں کے ساتھ ایس کیو ایل فائلیں لکھنا

ڈیٹا کا تجزیہ کرتے وقت، فرض کریں کہ ہم نے دریافت کیا کہ چند اندراجات میں ترمیم کرنے کی ضرورت ہے یا ڈیٹا کے ساتھ ایک نیا ٹیبل یا ویو درکار ہے۔ نیا ریکارڈ اپ ڈیٹ کرنے یا داخل کرنے کے لیے، ایک طریقہ استعمال کرنا ہے۔ read_sql() اور ایک سوال لکھیں. تاہم، یہ طریقہ طویل ہوسکتا ہے. پانڈا نامی ایک عظیم طریقہ فراہم کرتے ہیں to_sql() اس طرح کے حالات کے لئے.

اس سیکشن میں، ہم سب سے پہلے ڈیٹا بیس میں ایک نیا ٹیبل بنائیں گے اور پھر موجودہ میں ترمیم کریں گے۔

ایس کیو ایل ڈیٹا بیس میں ایک نیا ٹیبل بنانا

اس سے پہلے کہ ہم ایک نیا ٹیبل بنائیں، آئیے پہلے بات کرتے ہیں۔ to_sql() تفصیل سے.

کیا ہے to_sql()?

۔ to_sql() پانڈاس لائبریری کا فنکشن ہمیں ڈیٹا بیس لکھنے یا اپ ڈیٹ کرنے کی اجازت دیتا ہے۔ دی to_sql() فنکشن ڈیٹا فریم ڈیٹا کو SQL ڈیٹا بیس میں محفوظ کر سکتا ہے۔

کے لیے نحو to_sql():

DataFrame.to_sql(name, con, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None, method=None)

صرف name اور con پیرامیٹرز کو چلانے کے لئے لازمی ہیں to_sql(); تاہم، دوسرے پیرامیٹرز اضافی لچک اور حسب ضرورت کے اختیارات فراہم کرتے ہیں۔ آئیے ہر پیرامیٹر پر تفصیل سے بات کریں:

  • name: ایس کیو ایل ٹیبل کا نام جس کو بنایا جائے یا تبدیل کیا جائے۔
  • con: ڈیٹا بیس کا کنکشن آبجیکٹ۔
  • schema: ٹیبل کا سکیما (اختیاری)۔
  • if_exists: اس پیرامیٹر کی ڈیفالٹ ویلیو "فیل" ہے۔ یہ پیرامیٹر ہمیں یہ فیصلہ کرنے کی اجازت دیتا ہے کہ اگر ٹیبل پہلے سے موجود ہے تو کیا کیا جائے گا۔ اختیارات میں "فیل"، "تبدیل کریں"، اور "ضمیمہ" شامل ہیں۔
  • index: انڈیکس پیرامیٹر بولین ویلیو کو قبول کرتا ہے۔ پہلے سے طے شدہ طور پر، یہ درست پر سیٹ ہے، یعنی ڈیٹا فریم کا انڈیکس SQL ٹیبل پر لکھا جائے گا۔
  • index_label: یہ اختیاری پیرامیٹر ہمیں انڈیکس کالموں کے لیے کالم لیبل کی وضاحت کرنے کی اجازت دیتا ہے۔ پہلے سے طے شدہ طور پر، انڈیکس ٹیبل پر لکھا جاتا ہے، لیکن اس پیرامیٹر کو استعمال کرتے ہوئے ایک مخصوص نام دیا جا سکتا ہے۔
  • chunksize: SQL ڈیٹا بیس میں ایک وقت میں لکھی جانے والی قطاروں کی تعداد۔
  • dtype: یہ پیرامیٹر کلیدوں کے ساتھ ایک لغت کو کالم کے ناموں اور اقدار کو ان کے ڈیٹا ٹائپ کے طور پر قبول کرتا ہے۔
  • method: طریقہ پیرامیٹر ایس کیو ایل میں ڈیٹا داخل کرنے کے لیے استعمال ہونے والے طریقہ کی وضاحت کرنے کی اجازت دیتا ہے۔ پہلے سے طے شدہ طور پر، یہ کوئی نہیں پر سیٹ ہوتا ہے، جس کا مطلب ہے کہ پانڈا ڈیٹا بیس کی بنیاد پر سب سے موثر طریقہ تلاش کریں گے۔ طریقہ پیرامیٹرز کے لئے دو اہم اختیارات ہیں:
    • multi: یہ ایک ہی SQL استفسار میں متعدد قطاریں داخل کرنے کی اجازت دیتا ہے۔ تاہم، تمام ڈیٹا بیس کثیر قطار داخل کرنے کی حمایت نہیں کرتے ہیں۔
    • قابل کال فنکشن: یہاں، ہم داخل کرنے کے لیے ایک حسب ضرورت فنکشن لکھ سکتے ہیں اور اسے میتھڈ پیرامیٹر استعمال کر کے کال کر سکتے ہیں۔

یہاں کا استعمال کرتے ہوئے ایک مثال ہے to_sql():

import pandas as pd
from sqlalchemy import create_engine engine = create_engine('sqlite:///C/SQLite/student.db') data = {'Name': ['Paul', 'Tom', 'Jerry'], 'Age': [9, 8, 7]}
df = pd.DataFrame(data) df.to_sql('Customer', con=engine, if_exists='fail') engine.dispose()

کسٹمر نامی ایک نئی میز ڈیٹا بیس میں بنائی گئی ہے، جس میں دو فیلڈز "نام" اور "عمر" ہیں۔

ڈیٹا بیس سنیپ شاٹ:

to_sql() کا آؤٹ پٹ

پانڈا ڈیٹا فریمز کے ساتھ موجودہ ٹیبلز کو اپ ڈیٹ کرنا

ڈیٹا بیس میں ڈیٹا کو اپ ڈیٹ کرنا ایک پیچیدہ کام ہے، خاص طور پر جب بڑے ڈیٹا سے نمٹنا ہو۔ تاہم، کا استعمال کرتے ہوئے to_sql() پانڈوں میں فنکشن اس کام کو بہت آسان بنا سکتا ہے۔ ڈیٹا بیس میں موجودہ ٹیبل کو اپ ڈیٹ کرنے کے لیے، to_sql() فنکشن کے ساتھ استعمال کیا جا سکتا ہے if_exists پیرامیٹر کو "بدلیں" پر سیٹ کیا گیا ہے۔ یہ موجودہ ٹیبل کو نئے ڈیٹا کے ساتھ اوور رائٹ کر دے گا۔

یہاں کی ایک مثال ہے to_sql() جو پہلے بنائے گئے اپ ڈیٹ کرتا ہے۔ Customer ٹیبل. فرض کریں، میں Customer ٹیبل میں ہم پال نامی صارف کی عمر 9 سے 10 تک اپ ڈیٹ کرنا چاہتے ہیں۔ ایسا کرنے کے لیے، پہلے ہم ڈیٹا فریم میں متعلقہ قطار میں ترمیم کر سکتے ہیں، اور پھر to_sql() ڈیٹا بیس کو اپ ڈیٹ کرنے کا فنکشن۔

کا کوڈ:

import pandas as pd
from sqlalchemy import create_engine engine = create_engine('sqlite:///C/SQLite/student.db') df = pd.read_sql_table('Customer', engine) df.loc[df['Name'] == 'Paul', 'Age'] = 10 df.to_sql('Customer', con=engine, if_exists='replace') engine.dispose()

ڈیٹا بیس میں، پال کی عمر کو اپ ڈیٹ کیا گیا ہے:

to_sql() کا آؤٹ پٹ

نتیجہ

آخر میں، پانڈا اور ایس کیو ایل ڈیٹا کے تجزیہ کے کاموں کے لیے دونوں طاقتور ٹولز ہیں جیسے کہ SQL ڈیٹا بیس میں ڈیٹا کو پڑھنا اور لکھنا۔ پانڈا ایس کیو ایل ڈیٹا بیس سے جڑنے، ڈیٹا بیس سے ڈیٹا کو پانڈاس ڈیٹا فریم میں پڑھنے اور ڈیٹا فریم ڈیٹا کو ڈیٹا بیس میں لکھنے کا ایک آسان طریقہ فراہم کرتا ہے۔

پانڈاس لائبریری ڈیٹا فریم میں ڈیٹا کو جوڑنا آسان بناتی ہے، جب کہ ایس کیو ایل ڈیٹا بیس میں ڈیٹا کو استفسار کرنے کے لیے ایک طاقتور زبان فراہم کرتا ہے۔ ڈیٹا کو پڑھنے اور لکھنے کے لیے پانڈا اور ایس کیو ایل دونوں کا استعمال ڈیٹا کے تجزیہ کے کاموں میں وقت اور محنت کو بچا سکتا ہے، خاص طور پر جب ڈیٹا بہت بڑا ہو۔ مجموعی طور پر، ایس کیو ایل اور پانڈوں کا ایک ساتھ فائدہ اٹھانا ڈیٹا کے تجزیہ کاروں اور سائنسدانوں کو اپنے ورک فلو کو ہموار کرنے میں مدد کر سکتا ہے۔

ٹائم اسٹیمپ:

سے زیادہ Stackabuse