CodeCrafters
764 subscribers
91 photos
51 videos
42 files
170 links
Download Telegram
تراکنش‌های پیشرفته: نقطه‌ی نجات (SAVEPOINT)

یه ویژگی توپ دیگه از Postgres می‌خوام بهتون معرفی کنم که کار با تراکنش‌ها رو توی شرایط پیچیده خیلی راحت‌تر می‌کنه. اسمش "نقطه‌ی نجات" یا SAVEPOINT هست.

تصور کنید یه تراکنش دارید و چند تا دستور داخلش انجام می‌دید. شاید بخواهید یه جایی وسط کار، یه نقطه‌ی امن داشته باشید که اگه هر اتفاقی افتاد، بتونید به اونجا برگردید و همه چی رو از اول انجام بدید. SAVEPOINT دقیقا همینه!

بذار یه مثال بزنم. فرض کنید می‌خوایم یه کارمند جدید به اسم Bob Young اضافه کنیم، بهش چندتا وابسته اضافه کنیم و بعد تراکنش رو تموم کنیم. ولی ممکنه یه جا تو کار اشتباهی پیش بیاد. برای همین از SAVEPOINT استفاده می‌کنیم:
BEGIN;

INSERT INTO employees (first_name, last_name, start_date, salary, job_title, manager_id, department_id) VALUES ('Bob', 'Young', current_date, 1, 'Jr Director of the Highwire', 2, 2);

SAVEPOINT saved_employee; // این نقطه‌ی نجاته!

INSERT INTO dependents (first_name, last_name, employee_id) VALUES ('oldest', 'kid', (SELECT employee_id FROM employees WHERE first_name = 'Bob' AND last_name = 'Young'));

INSERT INTO dependents (first_name, last_name, employee_id) VALUES (null, 'kid', (SELECT employee_id FROM employees WHERE first_name = 'Bob' AND last_name = 'Young'));

ROLLBACK TO SAVEPOINT saved_employee; // اگه یه مشکلی پیش بیاد، به نقطه‌ی نجات برمی‌گردیم!

COMMIT;


حالا اگه اسم Bob Young رو توی کارمندها Search کنیم، پیداش می‌کنیم، ولی وابسته‌هایش رو نمی‌بینیم. چرا؟ چون وقتی توی اضافه کردن وابسته‌ها یه خطایی پیش اومده، تراکنش رو به نقطه‌ی نجات برگردوندیم و فقط اضافه‌کردن Bob Young انجام شده.

می‌دونم این مثال یه کم مصنوعیه، ولی SAVEPOINT توی شرایط پیچیده‌تری که معمولاً برنامه‌نویس هم باهاش درگیره، خیلی کارآمد میشه. فعلاً شاید لازم نباشه ازش استفاده کنی، ولی خوبه بدونی همچین ویژگی‌ای وجود داره!

#postgresql
@Code_Crafters
3👍1
محاصره در تراکنش ها

یه چیزی هست که شاید خیلی‌هاتون متوجهش نشده باشید. اونم اینه که توی PostgreSQL، حتی ساده‌ترین دستورات هم توی یه تراکنش انجام می‌شن! عجیبه نه؟

شاید بگید "خب چطور می‌شه فهمید؟ ما که تراکنشی شروع نکردیم!". ولی یه خورده صبر کنید... می‌تونیم یه دستوری اجرا کنیم که برامون نشون بده الان داخل کدوم تراکنشیم. بفرما:

SELECT txid_current();


حالا چی شد؟ یه عددی بهتون نشون داد، درسته؟ ولی ما که چیزی شروع نکردیم! چون اون عددی که دیدید، شناسه‌ی تراکنشیه که همین الان توش هستید.

حالا بازم همون دستور رو اجرا کنید. چی می‌بینید؟ اون عدد، یه واحد زیادتر شده! آره، این یعنی حتی همین یه دستور کوچیک، یه تراکنش جدید برا خودش باز کرده.

شاید بپرسید چرا انقدر ریزه‌کاری؟ خب، اینجوری PostgreSQL، خیالش راحته که هر تغییری که انجام می‌شه، یا کاملاً انجام می‌شه، یا اصلاً انجام نمی‌شه. اگه توی یه دستور مشکلی پیش بیاد، کل تراکنش باطل می‌شه و هیچ تغییری اعمال نمی‌شه.

پس یادتون باشه، توی PostgreSQL، همیشه تو یه تراکنش هستید، چه بخواهید، چه نخواهید! این یه جور مراقبت اضافه‌ست که داده‌هاتون رو سالم نگه می‌داره.

#postgresql
@Code_Crafters
👍52
چرا جنگو‌ فریمورک محبوبی هست؟؟؟

بیاید یکم راجبش حرف بزنیم

جنگو‌ خیلی از موارد برنامه نویسی مدرن رو براتون فراهم میکنه بدون اینکه خودتون راجبش حتی دانش کافی داشته باشید و بدونید، که میتونیم به design patterns و clean architecture اشاره کرد

بارها به بچه‌ها گوشزد کردم که business logic رو فراموش نکنید و جدی بگیرید ،کار سختی نیست یک فایل با نام services.py بسازید و موارد مربوط به orm رو داخلش بنویسید (یک دایرکتوری با نام services بسازید و ماژول‌های پایتونی خودتون رو داخلش بزارید) حالا کافیه با dependency inversion principle رو بدونید و داخل کدهاتون رعایت کنید

خب چه اتفاقی افتاد؟؟؟
الان شما اومدین و app رو به سه لایه تقسیم کردید لایه application ، لایه service ، لایه infrastructure , خب این چه مزیتی داره برامون

بیایم ببینیم هر لایه شامل چه چیزی میشه؟؟؟
Application: urls, views
درخواست‌های مشتری در این قسمت مورد پردازش قرار میگیره که داده‌های مورد نیاز رو از لایه service میگیره و اون رو تبدیل میکنه به مقداری که قابل خوندن واسه مشتری هست که میتونه http, drf, grpc و ... باشه


Service:
این لایه همون مبحث business logic رو ارائه میده و تمام موارد مورد نیاز رو در خودش هندل میکنه(وظیفه ذخیره و بازیابی موجودیت‌هارو برامون هندل میکنه) اینجا orm django کار میکنه لایه انتزاع از دیتابیس رو میسازه و بواسطه شی گرایی مارو از پیچیدگی کار رها میکنه

Infrastructure: migrations , models
تو این قسمت شما موجودیت‌ها و مجموعه‌ها رو در یک سیستم ذخیره ساز، ذخیره میکنید ،اینکار با استفاده از مدل‌های جنگو و queries صورت میگیره ، بخش مایگریشن‌ها هم اینجا صورت میگیره
من این همه سردرد رو واسه چی دارم تحمل میکنم خدایی؟؟؟

شما دارید ذره ذره به سمت bounded context ها میرید

خب اینکه گفتیم به چه معناست اصلا؟؟
نکته: ما همیشه میگیم تسک بزرگ رو به چند تسک کوچیکتر بشکنید (بصورت منطقی البته) یک کلاس بزرگ ننویسید یک تابع طولانی نسازید

ما اینهارو‌ رعایت کردیم به کجا داریم میرسیم؟؟؟
جالبه بدونید که داریم به سبک معماری DDD نزدیک میشیم

بیایید ادامه بدیم
خب اصل SoC میاد وسط(پروژه میتونه به بخش‌های کوچکتر و قابل مدیریت تر تقسیم بشه، اجزا میتونه میکروسرویس یا ماژولهای مستقل در یک مونولیت باشند)
همین ترکیب بالا رو بزاریم داخل microservice ، پروژه خودمون رو به چند سرویس منطقی و درست تقسیم کنیم، مدلهای هر سرویس رو داخل یک دیتابیس جدا بزاریم ، FKهای مدل رو به Bigint تبدیل کنیم ارتباط‌ بین سرویس‌ها رو مدیریت و هندل کنیم (اینجا rabbitmq سلام میرسونه) الزامات سرویس‌های بیس رو انجام بدیم (این شد bounded context)

چه اتفاقی داره میافته ؟؟؟
هر بخش داره بصورت مستقل توسعه داده میشه 

نگرانی حاصل از پیچیدگی داره رفع میشه

بهبود توسعه کد و پایداری داره بخوبی اتفاق میافته

پایگاه داده از شکستن داره خارج میشه
به معماری DDD خوش آمدید
این معماری برای پروژه‌های بزرگ مناسبه و اگر یک پروژه قدیمی با حداقل 20 app دارید لازم نیست تعطیلش کنید فقط کافیه با DDD تبدیلش کنید
یک معماری میکروسرویس پیاده سازی کنید

که شامل چند سرویس میشه

هر سرویس در دل خودش چندتا app داره

هر app طبق DDD به سه لایه application , services , infrastructure تقسیم میشه و دیتابیس خودش رو داره

خود جنگو براتون clean architecture رو تا سطح بالایی براتون اتخاذ میکنه

در کدهاتون dependency inversion principle رو رعایت کنید





@code_crafters
4👍2
Media is too big
VIEW IN TELEGRAM
ما از دنیا حذف شده ایم!
#appex #2024 #filternet
👍7
پارتیشن‌بندی | Partitioning

فکر کن یه انبار بزرگ داری پر از وسایل. بعضی هر روز استفاده میشن، بعضی یه ماه یه بار، بعضی سال به سال یه نگاه بندازیشون می‌کنی، و یه سری هم هستن که دیگه اصلا به کار نمیان. اگه همشون رو یه جا و به یه شکل نگه داری، انبارت هم شلوغ میشه، هم پیدا کردن سخته، هم نگهداری هزینه‌بر میشه.

پارتیشن‌بندی دقیقا همون چوب جادویی برای انبار داده‌هایت محسوب میشه! با پارتیشن‌بندی، داده‌هات رو بر اساس استفاده و اهمیتشون طبقه‌بندی می‌کنی. به این ترتیب، اون اطلاعاتی که زیاد به کار نمیان یا دیگه قدیمی شدن رو توی بخش‌های کم‌هزینه‌تر و دورتر انبار (مثلا آرشیو) می‌ذاری، درحالیکه چیزایی که همش دم دستت هستن رو جلوی دست نگه می‌داری (مثل دیتابیس اصلی).

حالا چطور این تقسیم و بخش‌بندی هزینه رو کم می‌کنه؟ یه مثال بزنیم: فرض کن انبارت پر از لباس‌های قدیمی باشه. خیلی از این لباس‌ها رو دیگه نمی‌پوشی. خب اگه همشون رو توی کمد رختخواب نگه داری، هم جای بیشتری می‌گیرن، هم هر وقت بخوای یه لباس جدید بذاری، باید همه رو جابه‌جا کنی و هم تمیز کردنشون سخته. ولی اگه اونایی که دیگه استفاده نمیشه رو ببری توی چمدون و زیر تخت بذاری، هم کمدت خلوت و مرتب‌تر می‌شه، هم دیگه لازم نیست هر دفعه همه رو جابه‌جا کنی و گردگیریشون کنی. پارتیشن‌بندی داده‌ها هم دقیقا همینطوره. اطلاعات قدیمی و کم‌کاربرد رو از دیتابیس اصلی درمیاری و به یه جای دیگه‌ای منتقل می‌کنی، مثلا یه هارددیسک دیگه‌ای یا یه سیستم آرشیو. اینجوری هم دیتابیس اصلی سریع‌تر و کوچیک‌تر می‌شه، هم هزینه‌ی نگهداری کم‌تر می‌شه.

پس پارتیشن‌بندی یه راه بی‌نظیره برای اینکه هم انبار اطلاعاتی منظمی داشته باشی، هم هزینه نگهداری رو مدیریت کنی. دیگه لازم نیست نگران انبار شلوغ و هزینه‌های اضافی باشی!

👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
2
سرعتِ جت با پارتیشن‌بندی: وقتی انبارت مرتب باشه، پیدا کردن وسایل هم سریع‌تره! 🚀

یکی از دلایلی که خیلی‌ها عاشق پارتیشن‌بندی هستن، افزایش سرعت جستجو توی داده‌هاست. تصور کن انبار وسایل‌ت مرتب و تفکیک‌ شده‌ باشه. اگه بخوای یه چیز خاص رو پیدا کنی، خیلی سریع‌تر پیداش می‌کنی، نه؟ پارتیشن‌بندی هم دقیقا همین کار رو با داده‌هات می‌کنه.

وقتی داده‌هات رو بر اساس تاریخ یا یه کلید خاص پارتیشن‌بندی می‌کنی، جستجوها به جای اینکه کل انبار رو زیر و رو کنن، مستقیم به بخش مربوطه می‌رن. مثل اینه که تو انبارت، برای هر دسته از وسایل یه قفسه جدا داشته باشی. حالا اگه دنبال کلاه زمستونی می‌گردی، مستقیم به قفسه‌ی لباس‌های زمستونی می‌ری، نه اینکه تک‌تک سبدهای خونه رو بگردی!

اینجوری جستجو خیلی سریع‌تر انجام می‌شه، مخصوصا وقتی از ایندکس‌ها یا همون برچسب‌های راهنما هم استفاده کنی. دیگه خبری از انتظارای طولانی برای پیدا کردن یه تیکه اطلاعات توی یه انبار داده‌های به‌هم‌ریخته نیست. همه چی مرتب و منظم، با دسترسی سریع و یه کلیک!

👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
2
انبار داده‌هات رو جورچین کن: با پارتیشن‌بندی‌های مختلف!

تصور کن یه انبار بزرگ داری پر از وسایل. حالا می‌خوای اونارو تو قفسه‌ها بچینی، ولی یه مدل چیدمان جواب نمیده. خب، پارتیشن‌بندی هم دقیقا همینطوره! راه‌های مختلفی برای تفکیک و چیدمان داده‌هات داری که به نوع اطلاعاتت بستگی داره.

چیدمان بر اساس بازه (Range): این محبوب‌ترین مدل برای دسته‌های زمانی یا داده‌های عددی مثل سال، ماه، روزه. مثلا می‌تونی اطلاعات فروش سال ۲۰۲۳ رو تو یه قفسه، سال ۲۰۲۴ رو تو یه قفسه دیگه بذاری. پیدا کردن اطلاعات یه سال خاص سریع و آسون می‌شه.

چیدمان بر اساس لیست (List): اگه داده‌هات یه دسته‌بندی مشخص دارن، مثل موقعیت جغرافیایی یا دسته‌های محصول، می‌تونی از این مدل استفاده کنی. مثلا اطلاعات مشتریای تهران رو تو یه قفسه، مشتریای مشهد رو تو یه قفسه دیگه بذاری. جستجو بر اساس دسته‌های خاص به راحتی انجام می‌شه.

چیدمان بر اساس هش (Hash): وقتی دسته‌بندی مشخصی برای داده‌هات نداری، می‌تونی از این مدل استفاده کنی. یه کد هش به هر تیکه اطلاعات اختصاص داده می‌شه و اونو تو قفسه مربوطه می‌ذاره. شبیه یه انبار با برچسب‌های مخفیه!

چیدمان ترکیبی (Composite): اگه دلت می‌خواد از ترکیب مدل‌های مختلف استفاده کنی، این گزینه ایده‌آله. مثلا می‌تونی داده‌های فروش رو هم بر اساس سال (بازه) و هم بر اساس نوع محصول (لیست) دسته بندی کنی. یه انبار مرتب و تفکیک‌شده‌ی دوبل!

این فقط یه نگاه کلی به مدل‌های مختلف پارتیشن‌بندی بود. حالا می‌تونی انتخاب کنی که کدوم مدل برای انبار داده‌هایت بهتره و یه دیتابیس منظم و دسترسی‌پذیر بسازی!

👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍1
بیا یه انبار داده‌های باحال بسازیم: مثال پارتیشن‌بندی با PostgreSQL

فکر کن یه عالمه داده درباره ترموستات‌های هوشمند داریم. دما، تاریخ، وضعیت روشن/خاموش و یه عالمه اطلاعات دیگه. خب، چطوری قراره این انبوه اطلاعات رو منظم و مرتب نگه داریم؟ اینجا با پارتیشن‌بندی تو PostgreSQL آشنا می‌شیم که حکم قفسه‌چین‌های حرفه‌ای رو دارن!

اول یه نگاهی به انبارمون بندازیم:
SELECT * FROM thermostat LIMIT 10;


این دستور ۱۰ تا ردیف اول از جداول thermostat رو نشون میده. هر ردیف شامل تاریخ، شناسه‌ی ترموستات، دمای فعلی و وضعیتش هست. حالا می‌تونیم این انبار رو با پارتیشن‌بندی مرتب‌تر و کارآمدتر کنیم. تو قسمت بعدی قراره ببینیم چطور میشه این کار رو انجام داد!

آماده‌ای بریم سراغ جادوی پارتیشن‌بندی با PostgreSQL؟ ⚡️

👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
ساخت قفسه‌های دیجیتالی: ایجاد جدول پارتیشن‌بندی‌شده

خب، حالا وقتشه دست به کار شیم و قفسه‌های دیجیتالیمون رو بسازیم! برای این کار، یه جدول جدید درست می‌کنیم که از همون اول پارتیشن‌بندی‌شده باشه. مثل اینکه قبل از چیدن وسایل تو انبار، قفسه‌ها رو آماده کنیم.

دستور زیر رو بزن تا جدول جدید iot_thermostat ساخته بشه:
CREATE TABLE iot_thermostat (
thetime timestamptz,
sensor_id int,
current_temperature numeric (3,1),
thermostat_status text
) PARTITION BY RANGE (thetime);


اینجا به PostgreSQL می‌گیم که جدول iot_thermostat رو با پارتیشن‌بندی بر اساس بازه‌های زمانی (RANGE (thetime)) درست کنه. یعنی قراره اطلاعات ترموستات‌ها رو بر اساس تاریخشون توی قفسه‌های جداگانه بچینیم.

یادت باشه که واسه پیدا کردن سریع‌تر وسایل توی انبار، لازمه برچسب‌های راهنما داشته باشیم. برای این کار از ایندکس‌ها استفاده می‌کنیم. دستور زیر یه ایندکس روی فیلد thetime می‌سازه:

CREATE INDEX ON iot_thermostat(thetime);


اینجوری PostgreSQL می‌تونه خیلی سریع‌تر اطلاعات رو بر اساس تاریخ پیدا کنه. دیگه لازم نیست کل انبار رو زیر و رو کنه!

حالا قفسه‌های دیجیتالیمون آماده‌ست که اطلاعات ترموستات‌ها رو توش بچینیم. تو قسمت بعدی می‌بینیم چطوری این کار رو انجام میدیم!

👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
برچسب‌های روی قفسه‌ها: ایجاد پارتیشن‌های جداگانه

یادت باشه که قراره اطلاعات ترموستات‌ها رو بر اساس تاریخشون توی قفسه‌های جداگانه بچینیم. الان وقتشه که این قفسه‌ها رو با برچسب‌های مخصوصشون بسازیم. هر برچسب یه بازه‌ی زمانی رو مشخص می‌کنه تا PostgreSQL بدونه هر تیکه اطلاعات باید کجا بره.

دستور زیر قفسه‌هایی برای تاریخ‌های ۲۳ جولای تا ۴ آگوست می‌سازه:

SQL 
CREATE TABLE iot_thermostat07232022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-23 00:00:000') TO ('2022-07-24 00:00:000');
CREATE TABLE iot_thermostat07242022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-24 00:00:000') TO ('2022-07-25 00:00:000');
CREATE TABLE iot_thermostat07252022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-25 00:00:000') TO ('2022-07-26 00:00:000');
CREATE TABLE iot_thermostat07262022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-26 00:00:000') TO ('2022-07-27 00:00:000');
CREATE TABLE iot_thermostat07272022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-27 00:00:000') TO ('2022-07-28 00:00:000');
CREATE TABLE iot_thermostat07282022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-28 00:00:000') TO ('2022-07-29 00:00:000');
CREATE TABLE iot_thermostat07292022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-29 00:00:000') TO ('2022-07-30 00:00:000');
CREATE TABLE iot_thermostat07302022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-30 00:00:000') TO ('2022-07-31 00:00:000');
CREATE TABLE iot_thermosta07312022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-31 00:00:000') TO ('2022-08-01 00:00:000');
CREATE TABLE iot_thermostat08012022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-08-01 00:00:000') TO ('2022-08-02 00:00:000');
CREATE TABLE iot_thermostat08022022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-08-02 00:00:000') TO ('2022-08-03 00:00:000');
CREATE TABLE iot_thermostat08032022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-08-03 00:00:000') TO ('2022-08-04 00:00:000');


یعنی از این به بعد، هر اطلاعاتی که مربوط به تاریخ ۲۳ جولای باشه، مستقیم میره توی قفسه iot_thermostat07232022 و با اطلاعات روزهای دیگه قاطی نمیشه. اینجوری هم انبارت مرتب میمونه، هم پیدا کردن وسایل راحت‌تر میشه.

حالا اگه بخوای اطلاعات یه روز خاص رو ببینی، فقط کافیه به قفسه مربوط به اون روز سر بزنی؛ نیازی نیست کل انبار رو بگردی. این یعنی سرعتِ جت در جستجو و دسترسی به داده‌ها!

👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
چیدن وسایل توی قفسه‌ها: وارد کردن اطلاعات به پارتیشن‌ها

خب، قفسه‌ها آماده‌ان، برچسب‌ها خوردن، حالا وقتشه وسایل رو توشون بچینیم! اینجا با یه دستور ساده، اطلاعات رو از جدول اصلی thermostat به جدول پارتیشن‌بندی‌شده iot_thermostat منتقل می‌کنیم:
INSERT INTO iot_thermostat SELECT * FROM thermostat;

نگران نباش، لازم نیست به PostgreSQL بگی کدوم اطلاعات باید کجا بره. خودش حواسش هست و هر تیکه اطلاعات رو بر اساس تاریخش، توی قفسه مناسبش میذاره. مثل یه ربات قفسه‌چین حرفه‌ای!🤖

برای اینکه مطمئن بشی همه چی درست انجام شده، می‌تونی یه نگاهی به یکی از قفسه‌ها بندازی:
SELECT * FROM iot_thermostat07242022 LIMIT 10;

این دستور ۱۰ تا ردیف اول از قفسه‌ی ۲۴ جولای رو نشون میده. اگه همه چی مرتب باشه، فقط اطلاعات مربوط به همون روز رو باید ببینی.

حالا انبار داده‌هات حسابی مرتب و منظم شده! هم پیدا کردن اطلاعات راحت‌تره، هم مدیریتش آسون‌تره. تبریک میگم، تو یه قفسه‌چین حرفه‌ای شدی!

👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
انبار مرتب، انبار بی‌دردسر: چرخش پارتیشن‌ها

حالا فرض کن دیگه به اطلاعات خیلی قدیمی نیاز نداری و فقط داده‌های اخیر مهم هستن. مثلا می‌خوای اطلاعات ۲۳ جولای رو تو یه جای دیگه آرشیو کنی و از انبار اصلی حذف کنی. اینجا یه ترفند جادویی به اسم چرخش پارتیشن به کار میاد!

با دستور زیر، قفسه مربوط به ۲۳ جولای (iot_thermostat07232022) رو از انبار اصلی جدا می‌کنیم:
ALTER TABLE iot_thermostat DETACH PARTITION iot_thermostat07232022;

حالا اون یه قفسه مستقل شده و دیگه تو انبار اصلی نیست. می‌تونی اونو به یه انبار آرشیو منتقل کنی تا فقط اطلاعات مهم و اخیر تو انبار اصلی باقی بمونن.

البته قرار نیست انبار خالی بمونه! باید یه قفسه جدید هم برای اطلاعات جدید بسازیم. دستور زیر یه قفسه با برچسب iot_thermostat0842022 ایجاد می‌کنه که اطلاعات ۴ و ۵ آگوست رو توش جا می‌ده:
CREATE TABLE iot_thermostat0842022 PARTITION OF iot_thermostat
FOR VALUES FROM ('2022-08-04 00:00:000') TO ('2022-08-05 00:00:000');


حالا با یه چرخش مرتب، قفسه‌های قدیمی رو آرشیو می‌کنیم و قفسه‌های جدید برای اطلاعات جدید اضافه می‌کنیم. اینجوری انبارت همیشه مرتب و منظم می‌مونه و فقط داده‌های مهم و قابل استفاده توش نگه می‌داری.

اگه قراره این چرخش رو هر روز انجام بدی، می‌تونی از یه ابزار به اسم cron job استفاده کنی تا همه چی به صورت خودکار و بدون زحمت انجام بشه. دیگه لازم نیست خودت قفسه‌ها رو جابه‌جا کنی!

یادت باشه، پارتیشن‌بندی یه ابزار جادوییه که بهت کمک می‌کنه انبار داده‌هات رو هم تمیز و مرتب نگه داری، هم مدیریت و دسترسی به اطلاعات رو آسون‌تر کنه. با چرخش پارتیشن هم میتونی اطلاعات قدیمی رو حفظ کنی، بدون اینکه انبار اصلیت شلوغ و بی‌نظم بشه. خب، حالا قفسه‌دار حرفه‌ای و مرتبی شدی!

👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍1
نکته مهم در مورد کدهای ارائه شده در پست های قبلی:

اگر می‌خواهید کدهای مربوط به تراکنش‌ها و پارتیشن‌بندی را امتحان کنید، لازم نیست PostgreSQL را نصب کنید!

سایت CrunchyData (https://www.crunchydata.com/) که منبع اصلی مقاله ترجمه شده در پست های قبلی بود، یک ترمینال PostgreSQL تعاملی در سمت راست صفحه خود ارائه می‌دهد که می‌توانید از آن برای تست کدها بدون نیاز به نصب هیچ نرم‌افزاری استفاده کنید.

لینک‌های مربوط به ترمینال PostgreSQL:

تراکنش‌ها:
https://www.crunchydata.com/developers/playground/transactions


پارتیشن‌بندی:
https://www.crunchydata.com/developers/playground/partitioning


👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
This media is not supported in your browser
VIEW IN TELEGRAM
جوابی که مدیر شرکت در جویای عدم درگیری و وجود اختلاف بکندکار و فرانتکار میگیره


جدا از طنز دو کارگردان وودی آلن و کریستوفر نولان شاهکار هستند


#fun

@code_crafters
👍4🦄1
برای بررسی لاگ‌ها در سرور معمولا دو ابزار قدرتمند وجود دارد grafana loki و ELK

در ریپوی مربوط به grafana که در گیتهاب کانال با عنوان sysadmin_monitoring موجود می باشد، loki رو داکرایز کردیم و با ابزارهای دیگه و پلتفرم‌های دیگه میتونید بالا بیارید

در این ریپو هم ELK رو داکرایز و کانفیگ کردم
که با کلون کردنش میتونید ازش استفاده کنید یک فایل زیپ شده هم برای تمرین و تست گذاشتم براتون

خب بین دو پلتفرم loki و ELK کدوم رو اسفاده کنیم؟؟؟
پلتفرم loki برای پروژه‌های متوسط و سرورهای معمولی مناسب هست ELK هم برای سیستم‌های بزرگ و معمولا میکروسرویسی

خود ELK مخفف elastic logstash kibana هستش

لینک ریپو رو در زیر براتون گذاشتم

https://github.com/CodeCrafters-ir/ELK.git


#devops
#monitoring

@code_crafters
5🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
وقتی ربات رو‌ جهت تست روی هاست مشتری اجرا میکنی ، و همون لحظه مشتری پسورد یوزر هاست رو تغییر میده


#fun

@code_crafters
😁9🤣2👍1
CodeCrafters
وقتی ربات رو‌ جهت تست روی هاست مشتری اجرا میکنی ، و همون لحظه مشتری پسورد یوزر هاست رو تغییر میده #fun @code_crafters
از خاطرات دنیای فریلنسری بهتون بگم

یبار یک‌ موتور جستجوی تصویر برای مشتری نوشتم با opencv که مبلغش بالا بود

کدهارو جهت تست روی سرور گذاشتم و بعد از گرفتن اولین خروجی ،مشتری پسورد رو تغییر داد و من رو بلاک کرد

اما من یک باگ داخل کدهام گذاشته بودم متاسفانه که باعث شد یکماه مشتری التماسم کنه
😁13
چرا conda استفاده کنیم؟؟؟


اول اینکه نوع پایتون رو هم خودش براتون بالا میاره حین ساخت محیط و شما دیگه درگیر پیچیدگی و هندل کردن نصب و مدیریت چند نسخه مختلف پایتون نمیشید و حتی کار کردن باهاش از pyenv راحت تره و عوض کردن نسخه پایتونش هم راحت تره

conda create -n MyENV python=3.8
دوم اینکه محیطی که براتون میسازه رو داخل home شما و در دایرکتوری مخصوص خودش میسازه و نه در مسیر جاری شما خب این مزیتش این هست که شما راحت هرجا باشید میتونید ۱-سریع فعال و ۲-غیرفعال و یا محیط خودتون رو تغییر بدید و یا بدون دغدغه نسبت به محل قرارگیریش محیط جدید بسازید و ۳-حذف هم کنید و بین محیط‌های مختلف راحت سویچ کنید

1- conda activate my_env

2- conda deactivate

3- conda env remove -n MyENV
مورد بعدی هم اینکه:
۱-نصب پکیج هم داخلش راحته
۲-و علاوه بر خودش میتونید از pip هم استفاده کنید
۳- همچنین بروز رسانی پکیج
1- conda install PackName

2- pip install PackName

3- conda update PackName
۱-لیست پکیج‌های نصب شده رو هم میتونید ببینید
۲-و یا یک فایل حاوی ادرس‌های آن جهت نصب بسازید
۳-و یا بصورت yaml براتون قرار میده که از دو بخش تشکیل شده پکیج‌هایی که خودش نصب کرده و پکیج‌هایی که با pip نصب شده

1- conda list

2- conda list --explicit

3- conda env export > requirements.yml
که بالطبع میتونید اون رو هم در یک محیط دیگه نصب کنید
conda create -f requirements.yml

conda create -n MyENV -f requirements.yml
گفتیم همه محیط‌ها رو در یک مسیر قرار میده که با دستور زیر هم میتونید لیست همه محیط هاتون رو ببینید

conda env list
۱- اگه بخواید یک‌محیط رو‌حذف کنید ۲-یا یک پکیج رو حذف کنید
1- conda env remove -n MyENV --all

2- conda remove PackName
برای دیدن اطلاعات مربوط به محیط تون
conda info
جهت تست و بررسی سلامت محیط
conda doctor
جهت تغییر نام محیط با شرط فعال نبودن محیط تون(فراموش نکنید conda یک محیط base داره که با دستور اولی فعال میشه)
conda activate

conda rename -n OldName NewName
۱-جستجوی پکیج با نمایش تاریخچه تگ آن
۲-مشاهده وابستگی های آن
۳-مشاهده پکیج‌ها استفاده کننده آن
1- conda search PackName

2- conda repoquery depends PackName

3- conda repoquery whoneeds PackName
ادغام محیط شل با conda
conda init bash
پاک کردن پکیج‌های نا استفاده
conda clean
برای کانفیگ از قبیل محیط نصب، پکیج‌ها محدودیت دانلود و ...
conda config

conda config --help
موضوع جالب اینکه هنگام نصب پکیج تمام وابستگی‌ها رو اجرایی میکنه و نصب و حتی اگه نیاز به نسخه دیگری از پایتون باشه اون رو downgraid میکنه که منجر میشه تا حد ممکن براتون خطایی رخ نده و دردسر نکشید


داخل کامنت ها هم نحوه نصبش رو در اوبونتو میزارم

#conda
#pip
#env

@code_crafters
👍51
خب بیاید یک کار کوچیک باهاش انجام بدیم

سیستم عامل من ubuntu 23.10 هستش که پایتون ۳.۱۱ روش نصب و من نیاز به نسخه ۳.۱۰ دارم و ...
در حالت معمول من باید برم پایتون نسخه ۳.۱۰ رو نصب کنم بعد یک جایی محیطی بسازم که دست نخورده و محافظت شده بمونه برام و دپندنسی هارو نصب کنم و بعد پکیج‌های مدنظرم رو و ... 😢😢😢
خب قبل از هرچیزی vscode و conda رو نصب میکنم

و تک دستور زیر رو میزنم
conda create -n ML python=3.10  scikit-learn jupyter
همین ،خودش تمام دپندنسی هارو برام نصب میکنه و تموم و با یک خط دستور راه هزار ساله قبلی رو رفتم،حالا کافیه هرجایی که دوست دارم یک work directory بسازم و vscode رو اجرا کنم و work directory رو‌ باز کنم

طبق تصویر بالایی اکستنشن هارو با python intellisense, python debugger نصب کنید

تصویر پایین، بالا سمت راست (قرمز شده) کلیک میکنم و یک پنجره کشویی در vscode باز میکنه گزینه python environments و سپس محیط ML رو انتخاب میکنم( کرنل انتخاب شد)

در قسمت سمت راست فایل‌هام رو با .ipynb میسازم (قرمز شده)


الان محیط jupyter با intellisense دارم


#conda
#pip
#env

@code_crafters
👍2
خب بریم سراغ داکرایز کردن پروژه با conda

عجله نکنید
بیاید قبلش یکم راجب محیط‌های conda حرف بزنیم و بیشتر باهاش آشنا بشیم و درک‌ کنیم conda چجوری باهاش کار میکنه


نکته هنگام نصب conda یک‌ محیط خودش بصورت پیش فرض میسازه با نام base

با دستور زیر میتونید محیط‌ها رو ببینید
conda env list
این رو فراموش نکنید خیلی بکارمون میاد بعدا


خب ما محیط خودمون رو میسازیم و داخلش پکیج‌هامون رو نصب میکنیم و پروژه رو‌توسعه میدیم
conda env create -n venv

conda activate venv

conda install django
حالا ما یک‌ محیط با اسم venv داریم و یکسری پکیج داخلش نصب هست


میدونیم با دستور زیر یک فایل که حاوی پکیچ‌ها هست رو میسازیم
conda env export > requirements.yml
خروجی اون بشکل تصویر خواهد بود(تصویر رو در کامنت براتون میزارم حتما ببینید و بعد ادامه بدید)
خط آخر رو پاک کنید یعنی prefix

حال اگه بخوایم این فایل رو‌ مجدد نصب کنیم خطا میده
conda env create -f requirements.yml
چرا؟؟؟
خط اول رو ببینید مقدار name این دقیقا اسم محیطمون هست

نکته conda میاد هم محیط رو میسازه و هم پکیچ‌هاش رو نصب میکنه

قبلا گفتیم conda تمام محیط‌ها رو در یک مسیر خاص قرار میده و‌ میسازه (این مسیر کجاست مقدار prefix انتهای فایل که گفتیم پاک‌ کنید) و خوب ما نمیتونیم دوتا محیط با یک اسم داشته باشیم (اگه محیط قبلی رو حذف کنید و دستور رو بزنید اجرا میشه) یا یکار باحال‌تر مقدار name رو داخل فایل بصورت دستی تغییر بدید و دستور رو بزنید باز هم کار خواهد کرد

تنها نکته باید بدونید این هست محیط تکراری نمیتونیم داشته باشیم، در ابتدای فایل اون name در واقع اسم محیطمون هست

اگه ما بخوایم پکیچ‌های این فایل رو در یک محیط دیگه نصب کنیم چکاری باید انجام بدیم؟؟؟

تصور کنید ما یک محیط دیگه با نام test داریم و میخوایم پکیچ‌های فایل requirements.yml رو‌ داخلش نصب کنیم

داخل همین فایل مقدار name رو به test(اسم‌ محیط مقصدمون) تغییر میدیم و دستور زیر رو میزنیم

conda env update -f requirements.yml
میره و این پکیج‌هارو در محیط test که داریم نصب میکنه داخلش


چیارو‌فهمیدیم؟؟؟
یک‌ محیط داریم همیشه با اسم base 

وقتی فایل requirements.ymlرو‌ میسازیم قسمت prefix رو‌ پاک میکنیم و کنترل کردن مقدار name در فایل خیلی مهم هست که بتونیم با دستورات create و update کار کنیم

نمیتونیم محیط با اسم تکراری داشته باشیم

و اینکه conda با دستور create محیط رو هم برامون میسازه و با دستور update به محیطی که داریم وصل میشه



حالا که محیط ها رو درک کردیم و فهمیدیم conda چجوری باهاشون رفتار میکنه ذره ذره آماده میشیم برای قدم اصلی

#conda
#pip
#env

@code_crafters
👍2