🧑‍💻PythonDev🧑‍💻
365 subscribers
86 photos
3 videos
15 files
78 links
Python tips and tricks
The Good, Bad and the Ugly

📚توی این کانال فقط قرار هست در مورد core python صحبت کنیم.

👨‍💻این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی این چند سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازه‌کار)👨‍💻


@Mtio975
Download Telegram
متغیر در پایتون چیست؟
اولین و پایه‌ای ترین مفهوم در یادگیری زبان برنامه نویسی پایتون آشنایی با متغیرها یا variable هاست.
متغیرها ساختارهایی هستند که برای ذخیره مقادیر در برنامه‌نویسی مورد استفاده قرار می‌گیرند.
متغیر در پایتون برای اشاره به مکان حافظه استفاده میشه.
متغیر پایتون همچنین به‌ عنوان شناسه شناخته می‌شود.

در این بخش علاوه بر یادگیری مفهوم متغیر انواع Data type‌ها نیز معرفی می‌شوند که متغیرها می‌توانند انواع این داده‌ها رو بپذیرند. این Data type ها شامل:

رشته ها یا string‌ها : به دیتاهایی گفته میشه که به صورت دنباله ای از حروف استفاده میشه ، مثل نام ها و عبارت ها و ...

اعداد صحیح یا integer‌ها : که ساده‌ترین مقادیر عددی مورد استفاده در محاسبات هستند.

اعداد اعشاری یا float : که برای محاسبات با دقت بالا در برنامه‌نویسی مورد استفاده قرار می‌گیرند.

متغیرهایی که مقادیر آنها به صورت درست یا نادرست (True /False)‌ هستند که به آن Boolean گفته میشه.

در تعریف متغیرها دو مورد باید رعایت بشه. یکی متغیرها باید با حروف آغاز بشن ،همچنین در تعریف متغیرها نباید از کلمات رزرو شده پایتون استفاده کرد.
مثلا عبارت print در پایتون برای تعریف یک تابع استفاده شده و نباید متغیری به این نام تعریف کرد.
نکته : قدرت کامپیوترها در واقع به برنامه نویسیشونه ، و برنامه نویسشون بسیار وابسته هست به چیزی به اسم متغیر ها یا همون variable ها ، چیز هایی که تغییر می کنند.

یعنی چی؟
مثلا⬅️ من ی چیزی دارم به اسم x و برابر 2 قرار میدم .
X=2
از این به بعد هروقت بگم x ، یعنی 2.
هروقت بخوام میتونم عدد x رو عوض کنم و برابر با چیز دیگه ای قرار بدم .

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

مثلا من میتونم بگم عدد pi = 3.14 و r = 50
بعد بخوام مساحت رو حساب کنم میگم pi ضربدر دوتا r
pi * r * r
و بعد run و جواب مساحت رو به ما میده.

میتونم pi = 3.1415926 قرار بدم و بعد
pi * r *r

pi رو که داریم
r هم بالا گفتیم مساوی 50 هست
و بعد run.

حالا اگه بگم masahat = pi * r * r
و مساحت رو run کنم ، جواب بالایی رو به من دوباره میده .

#Flx
#variable
ی چیزی که خیلی مرسومه ، اینه که من میگم x = 1
چی میشه ؟
وقتی همچین چیزی میگیم ، ی جایی از حافظه کامپیوتر اسمش هست x ، داخلش 1 قرار داده میشه.
بعد برای برنامه نویس ها خیلی پیش میاد که بنویسن x = x + 1
چجوری حساب میشه؟
اول میاد x + 1 رو حساب می‌کنه ، پیش خودش میگه که من چیزی به اسم یا مکان x می شناسم؟ میره چک می کنه و میفهمه بله ، و در داخلش عدد 1 قرار داده شده .
پس میشه 1 + 1 که میشه 2 و x مساوی 2 میشه.
حالا هرجا بنویسیم x به ما 2 میده.
خیلی بدیهی هستش ، و ما تو جبر همچین چیزی نداریم که x = x + 1
ما می خواستیم مقداردهی انجام بدیم نه اینکه بیا ی معادله حل کن.
بلکه بهش میگم x رو برابر x + 1 قرار بده.

نکته : خوبه که برای متغیر ها اسم های خوبی انتخاب کنیم.

#Fxl
نحوه اعلام متغیر پایتون معتبر میتونه هر طولی داشته باشه که دارای حروف بزرگ، کوچک (A تا Z، a تا z)، رقم (0-9) و آندرلاین (_) باشه.

نمونه نام‌گذاری متغیر در پایتون:
نمونه‌هایی از شناسه‌های معتبر: a123، _n، n_9 و غیره.

نمونه‌هایی از شناسه‌های نامعتبر: 1a، n٪ 4، n 9 و غیره.



نام متغیرها می‌تونه گروهی از حروف و ارقام باشه، اما اونها باید با یک حرف یا آندرلاین شروع بشن. توصیه میشه برای نام متغیر از حروف کوچک استفاده کنید.
#Fxl
#name
#variable
برای تخصیص مقدار به یک متغیر از عملگر Equal (=) استفاده میشه.



وقتی ما یک متغیر رو اعلان می‌کنیم، لازمه درک کنیم که مفسر پایتون چجوری کار می‌کنه. فرایند ایجاد متغیرها تا حدودی با بسیاری از زبان‌های برنامه‌نویسی متفاوته.
پایتون زبان برنامه‌نویسی بسیار شیء گراست. به مثال توجه کنید :
آبجکت پایتون یک عدد صحیح ایجاد می کنه و اون رو روی کنسول نمایش میده ، در دستور چاپ بالا ، یک شئ رشته ایجاد کرده و نوع اون رو با استفاده از تابع type() مشخص کردیم.
#Fxl
#variable
#str
#Hello_world
در پایتون، متغیرها یک نام نمادین هستند که مرجع یا اشاره‌گر یک شیء هستند.
متغیرها برای نشون دادن اشیاء با اون نام استفاده میشن.
#Fxl
#variable
بیایید باهم چند مثال تحلیل کنیم :



در این تصویر ، متغیر a به یک شیء صحیح اشاره داره.

#Fxl
فرض کنید مقدار صحیح 70 رو به یک متغیر جدید b اختصاص میدیم.

a = 70
b = a

متغیر b به همون شیء اشاره می‌کنه که به a اشاره می‌کنه ، چون پایتون شیء دیگری ایجاد نمی‌کنه.

#Fxl
بیایید مقدار جدید رو به b اختصاص بدیم . حالا هر دو متغیر به اشیاء مختلف ارجاع داده میشن.

a =70
b =90

اگه متغیر یکسانی رو به دو مقدار متفاوت اختصاص بدیم ، پایتون به‌طور مؤثر حافظه رو مدیریت می‌کنه.

#Fxl
هویت شیء در پایتون :

در پایتون، هر شیء ایجادشده به‌طور منحصربه‌فرد مشخص میشه.
پایتون تضمین می‌کنه که هیچ دو شیء شناسه یکسانی ندارند.
تابع id () داخلی، برای شناسایی شناسه شیء استفاده میشه.
به مثال توجه کنید.

#Fxl
خروجی :

ما b = a، a و b رو هر دو به یک شیء یکسان اختصاص میدیم.
وقتی تابع id () رو بررسی می‌کنیم ، همون شماره رو برمی‌گردونه.
ما a رو به 500 واگذار می‌کنیم. و بعد به شناسه جدید شیء اشاره کرد.

#Fxl
بنظرم به جای Makefile از justfile استفاده کنید بهتره, به دو دلیل:

۱. مولتی پلتفورمه
۲. خیلی سینتکس بهتری داره

تو هر پروژه ای, بنظرم باید کامندی وجود داشته باشه که:
۱. دیتا سپل جنریت کنه برای تست دستی
۲. دیتابیس رو ریست کنه با دیتای جدید
۳. تیبلا رو مجدد بسازه
۴. ماگریتی که نوشتین رو بتونه تست کنه
۵. اینستال پروژه هندل شه
۶. برای ران تست هم کامند جدا باید باشه

همیشه ترجیح میدم از poetry استفاده کنم چون خودش پکیج میسازه برام و lockfile داره و میتونم توش خودم پکیج بسازم که به صورت live از روش بخونه و آپدیتش کنه (مثل shared library بین سرویسا)

Justfile: https://github.com/casey/just


برای تست ماگریشنتون:
۱.  باید تیبل هاتون رو پاک کنید
۲. باید برید برنچی که ازش برنچ میگیرین مثلا dev
۳. دیتابیس رو بسازید با اون برنچ و migration هایی که بوده اونجا رو اسکیپ کنید
۴. برگردین برنچی که کار میکردین روش
۵. ماگریشن رو حالا ران کنید تا اخرین نسخه
۶. دیتابیسو چک کنید ببینید چه بلایی اوردین سره دیتابیس :))

بهتره خودکار انجام شه کل این پروسس با یک کامند
🥚 ایسترگ‌ها (Easter egg) و سیکرت‌های جالب پایتون!

1️⃣ - توی ترمینال یا CMD، واسه تست پایتونتون، کامند زیر رو ران کنید و پروگرم hello world اجرا میشه.

$ python -m hello
Hello World!

2️⃣ - برای چاپ کردن ذن پایتون، کافیه ماژول this رو ایمپورت کنید و یه لیست از استعاره‌های بامفهوم برنامه‌نویسی رو واستون چاپ می‌کنه.

$ python -c 'import this'

👈
ماژول ذن this.py در ریپازیتوری CPython

3️⃣ - اگه حوصلتون سر رفته و می‌خواید چند تا کامیک ساینس-طور ببینید، کامند زیر رو ران کنید. بهتون دسترسی به آرشیو xkcd میده که محفلیه پر از میم‌ها و جک‌های دنیای خودمون.

$ python -c 'import antigravity'

4️⃣
- اگه می‌خواید از فیچر‌هایی که قراره در آینده به پایتون اضافه شه استفاده کنید، می‌تونید از future استفاده کنید. مثلا توی پایتون۲، پرینت یه تابع نبود ولی اگه ماژول زیر رو ایمپورت می‌کردید، مفسر پایتون۲ از این به بعد به دید یه فانکشن به print نگاه می‌کرد و باید از پرانتز جلوی پرینت استفاده می‌کردید.

#!/usr/bin/python2
from future import print_function

حالا نکته جالبش اینجاس که ما توی تقریبا تمام زبان هایی که بیسشون C هست، از {} بعنوان تعیین اسکوپ فانکشن، شروط، کلس‌ها و.. استفاده می‌کنیم که توی پایتون به این شکل نیست و block-indentation مهمه. حالا اگه سعی کنید braces رو از future ایمپورت کنید میاد و اینجوری بهتون تیکه میندازه..

>>> from future import braces
SyntaxError: not a chance

5️⃣ - می‌دونستید میشه هش بی‌نهایت و Not-a-numbert رو توی پایتون نشون داد..؟! جالبه نه؟

>>> hash(float('inf'))
314159
>>> hash(float('nan'))
0

👈 اینجا جاییه که بعنوان دوتا ثابت در کدبیس CPython تعریف شدن

6️⃣ - میدونستید یه جایگزین جالب واسه آپریشن =! (نامساوی) توی پایتون هست؟!

>>> 1 != 0
True
>>> from future import barry_as_FLUFL
>>> 1 != 0
SyntaxtError: with Barry as BDFL, use '<>' instead of '!='
>>> 1 <> 0
True
>>> 2 <> 2
False

شاید واستون جالب باشه ولی این قضیه بعد از اینکه Maintain پروژه پایتون توسط Guido به Barry داده شد، رواج پیدا کرد. واسش حتی PEP401 هم نوشتن که من (شخصا) موجودیتش رو درک نکردم ولی ارزش خوندن داره و نکات جالبی درباره تاریخچه پایتون میگه. :)

=> منبع اصلی این پست در Medium
🧑‍💻PythonDev🧑‍💻
خروجی : ما b = a، a و b رو هر دو به یک شیء یکسان اختصاص میدیم. وقتی تابع id () رو بررسی می‌کنیم ، همون شماره رو برمی‌گردونه. ما a رو به 500 واگذار می‌کنیم. و بعد به شناسه جدید شیء اشاره کرد. #Fxl
خب شبتون بخیر دوستان شنیدم که تو شهر متغیر ها دارید میچرخید 😆

اومدم یه درس کوچولو بهتون بدم و در عین حال که ساده هست میتونه جذاب هم باشه.

بحث عملگر ها) Operators(:از اسم بحث مشخصه که قراره کلی محاسبات داشته باشیم.
عملگر ها در اصل برای پردازش های حسابی و منطقی استفاده می‌شود.
عملگر ها سمبل هایی هستن که برای محاسبات و ریاضیات بیشتر مورد استفاده قرار میگیرن.
شما برای به جمع رسوندن 2 عدد صحیح نیاز دارید از یک عملگر استفاده کنید.
این عملگر چی میتونه باشه؟ یک + آره با یک + میتونید دو عدد رو به جمع برسونید
پس عملگرها در پایتون بر اساس تعاریف بالا شامل:
+
-
*
/
هستند اما تعداد و دایره عملگر ها فقط به این 4 تا محدود نمیشه.
درواقع ما انواع عملگر داریم که شامل موارد زیر هستن :
1.عملگر های حسابی
2.عملگر های مقایسه ای
3.عملگر های منطقی
4.عملگر های بیتی
5.عملگر های خاص
6.عملگر های تخصیص

در این درس فقط مورد اول و دوم رو قراره کار بکنیم و مابقی رو در جلسات آینده کار خواهیم کرد.



**بیایین پست بعدی بریم واس روستای عملگرها تو شهر متغیر ها یه هوایی تازه کنیم

#Operators
#Sxl
مورد اول:
عملگر های حسابی که شامل
+ برای جمع استفاده میشه
-برای منها کردن و کم کردن
* برای ضرب کردن
/ برای تقسیم کردن استفاده میشه
// برای خارج قسمت
% برای باقی مانده
برای توان استفاده میشه


بیایید برای مثال:
2 + 2
3 - 2
6 * 3
9 / 3
9 // 3
9 % 6
2
2

این عملگر هارو اگر با متغیر ها تلفیق کنید چه شود!!!
مثلا:
Input:
X = 10
Y = 20
Print (X * Y)

Output= 200

دوتا متغیر تعریف کردیم به اسم های X و Y برای هر دو متغیر 2 عدد لحاظ کردیم با عملگر = یعنی برابری دادیم اون عدد رو با اون متغیر بعد اومدیم پرینت گرفتیم)چاپ گرفتیم( ضرب این 2 متغیر رو.

یا به این مثال توجه کنید:
A = 100
B = 10
Print (A / B)

Output : 100


بریم برای پست بعدی.
#Operators
#python
#Sxl
مورد دوم :
عملگر های مقایسه ای هستن که شامل:
> بزرگتر از
< کوچکتر از
== مساوی است با
!= نامساوی
=<کوچکتر مساوی
=>بزرگتر مساوی
از اسم این عملگر ها معلومه که کارشون کلا مقایسه هست مثلا مقایسه 2 عدد باهم.مثلا در قسمت شرط دهی می‌نویسیم اگر فلان مورد برابر با فلان مورد باشد فلان چیز رو پرینت کن یا اگر فلان عدد بزرگتر از فلان عدد باشد بهمان چیز رو چاپ کن
در پست های بعدی با مثال های تحلیلی و کاربردی درسارو تکمیل تر میکنیم.


اینجا یه لینکی از عملگرها در پایتون میزارم براتون که بتونید یه مطالعه ای هم داشته باشید.
https://www.w3schools.com/python/python_operators.asp


یه مقاله خوبم براتون آوردم که میتونه براتون مفید باشه:
Operators in Python:
https://www.linkedin.com/pulse/operators-python-dharan-kumar-bera?utm_source=share&utm_medium=member_android&utm_campaign=share_via

#Sxl
This media is not supported in your browser
VIEW IN TELEGRAM
بدون نوشتن کد، داده‌هاتُ توی پایتون تحلیل کن

کتابخونه Bamboolib از اون کتابخونه‌هایی هست با این کتابخونه هر کسی میتونه بدون برنامه‌نویسی، داده‌هاش رو با پایتون تحلیل کنه.
این کتابخونه خودش کدهارو به صورت خودکار تولید میکنه که با خوندن این کدها، میتونیم حتی کدنویسی رو یاد بگیریم.
در اصل کتابخونه Bamboolib یک GUI برای Pandas هست که با Jupyter Notebook میشه ازش استفاده کرد.

https://pypi.org/project/bamboolib/
https://bamboolib.8080labs.com/
https://towardsdatascience.com/bamboolib-one-of-the-most-useful-python-libraries-you-have-ever-seen-6ce331685bb7
https://medium.com/analytics-vidhya/bamboolib-a-gui-for-pandas-e5109f7bccff
🔮 برای آینده کُد بنویس
🎓به مناسبت روز دانشجو
🎓

😉 ۲۰ ٪ تخفیف روی همه دوره‌های کوئراکالج
🙈 ۲۰ ٪ شارژ حساب کوئرایی بعد از ثبت‌نام

🗓 از ۱۱ تا ۱۶ آذر ماه

💎 مسیرهای یادگیری:
🔘مسیر Python - Django
🔘مسیر php- Laravel
🔘مسیر Golang
🔘مسیر Front-End
🔘مسیر Machine Learning
🔘مسیر المپیاد
🔘دوره‌های عمومی(Git-Linux-Database-NoSQL)

در کنار هم، پیش به سوی برنامه‌نویس شدن:
🔗 https://quera.org/r/ce8yr


#Quera #Quera_College
@Quera_ir
دوستانی که میپرسن چطور من sql یاد گرفتم:

۱. اولا هیچ query رو اخیرا دیگه رو اول تو orm به صورت کد نمینویسم مگه اینکه یک چیز خیلی ابتدایی باشه. اول همیشه با دیتابیس مینویسم بعد میام رو orm معادلشو مینویسم. این عادتو حتما ترک بدین و به محیط دیتابیس عادت کنید.

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

۳. همین query هایی که طی روز مینویسید تلاش کنید بهینه و با ۱ هیت بنویسید. با ۱ هیت نوشتن دلیل بر این نمیشه که query بهینه شد. explain و analyze رو بزنید ببینید چه اتفاقی داره میفته. با مفاهیم داخل دیتابیس آشنا باشین. بدونید cost estimate و execution plan وactual time و rows and width و buffers چیه. صرفا سریع ران شدن هم دلیل بر آپتیمایز بودن یک query نیست. ممکنه مموری خیلی زیادی مصرف کنه. پس متریک های دیتابیس رو یاد بگیرین. و کار کردن باهاش رو. مثل یک زمین بازی میمونه هرچی بیشتر توش بازی کنید بیشتر یاد میگیرین.

آیا مهمه؟
صد در صد 🙂 اخیرا دیدم تو community پایتون خیلی مانور میرن رو اینکه پایتون رو بشدت دیپ شن. بد نیستا ولی اولویت بندی کنید از بقیه چیزا غافل نشید. خیلیا که با orm کار میکنن اگه ۵ تا سوال sql ازشون بپرسن بلد نیستن چون تو عمرشون زیاد تو دیتابیس نچرخیدن و سرو کله نزدن.
پست امروز رو با دو سوال سطح سخت SQL شروع میکنم:

شما فرض کنید مقداری تراکنش یا سفارشات داخل یک دیتابیس روزانه دارین, به همراه قیمتی که فروخته شدن و مقدارشون و زمان فروخته شدنشون, مثلا:

id  product_id  product_amount  total_price   created_at  
1     1                     20                      100,000                   ...     


۱. یک query بزنید که تغییر قیمت رو به صورت روزانه به ازای تمام record ها دربیاره. و البته میانگین قیمت اون روز 🙂 با فرض اینکه فقط برای یک product id رو میخواین در بیارین (product_id = 1). تغییرات قیمت یعنی مثلا امروز پروداکت id=1 به ازای هر یک دونه اش  ۱۰۰ تومن بوده میانگینش, فردا شده ۹۹ تومن, پس ۱ تومن کم شده. اینو باید تو query اول به دست بیارین. که میشه -۱ مثلا. یا میتونه مثبت هم باشه. یعنی نسبت به روز قبلش باید حساب کنید ارزون شده یا گرون و چقدر؟.

۲. تیمی که سفارشات رو حاضر میکنه سفارشات رو export میگیره. همچنین داخل مغازه هم سفارشاتی میرسه. سپس مجددا دیتا رو ایمپورت میکنه. حالا تیم میخواد یک import به برنامه بده که اگه سفارش وجود داشت با مقادیر جدیدی که داخل اکسل داده آپدیتش کنه و اگه وجود نداشت بسازش. و در آخر بعد از ایمپورت متوجه شه چه سفارشاتی آپدیت شده و چه سفارشاتی ساخته شده. این رو با 1 query بنویسید.

راهنمایی:‌ دیتابیسمون PostgreSQL هست.وقتی تو رزومتون میزنید PostgreSQL بلدین یعنی دقیقا همچین Query هایی رو باید باهاشون آشنا باشین!
راهنمایی دوم:‌این دو query خیلی کوتاه و خوانا هستند!
🧑‍💻PythonDev🧑‍💻
پست امروز رو با دو سوال سطح سخت SQL شروع میکنم: شما فرض کنید مقداری تراکنش یا سفارشات داخل یک دیتابیس روزانه دارین, به همراه قیمتی که فروخته شدن و مقدارشون و زمان فروخته شدنشون, مثلا: id  product_id  product_amount  total_price   created_at   1     1  …
سید جواب سوال یک رو داد. اما چطوری جواب سوالا رو بدیم؟‌بحث میزان آشنایی با SQL و PostgreSQL هست. با توابع و window function ها اشنایی داشته باشیم. چیزایی که میتونه PostgreSQL رو خاص کنه.

اولین سوال چیه؟‌سوال راجب Financial analysis هست. اگه با LAG آشنا باشین دقیقا کاربرد اساسیش همینه. هرجایی که comparision و analysis بر اساس دیتا های قبلی و بعدی باشه میتونیم از lag استفاده کنیم. برای Performance Metric هم خیلی به درد میخوره! یا برای آنالیز Sequence ای از دیتا ها. مثلا آنالیز کن کاربر هایی که ۵ تا سفارش دادن ایا هر سفارششون بزرگ تر از سفارش قبل هست یا نه؟‌ (مثلا سفارش پنجیمشون بزرگ تر از چهارمیه؟) کل این با یک queryبدست میاد. معمولا هم خیلی خوانایی بالایی داره. یک نکته دیگه این سوال استفاده از cte هست چون اول باید دیتا رو batch کنیم (سفارشات هر روز رو)‌و بعد آنالیزشون کنیم. طبق جواب سید:


WITH DailyPrices AS (
    SELECT  DATE(created_at) AS date,  AVG(total_price / product_amount) AS average_price
    FROM orders WHERE product_id = 1 GROUP BY DATE(created_at)
)
SELECT
    date,
    average_price,
    average_price - LAG(average_price) OVER (ORDER BY date) AS price_change
FROM
    DailyPrices;


سوال دوم. خب مشخصه از ما mass operation میخواد. مثل mass insert. اگه نمیگفت آپدیت شدن یا ساخته شدن رو نشون بده اونوقت از upsert استفاده میکردیم. upsert یعنی اگه وجود داره update کن اگه نه insert.  پس باید upsert رو به نوعی خودمون بسازیم. upsert چیکار میکنه دقیقا؟‌اول سعی میکنه insert کنه بعد اگه conflict به وجود اومد update میکنه.  همینو کافیه خودمون بنویسیم و در نهایت بگیم که ایا اپسرت شده یا ایسنرت. نکته خیلی مهم تر هم اینه که RETURNING داشته باشیم. خیلی مفیده این. به شما میگه چه دیتایی رو آپدیت کردین


INSERT INTO product_order (id, user_id, product_id, product_amount, total_price, status)
VALUES
    (UUID..., 'txn1001', 1, 1.5, 15000, "DONE"),
    (UUID..., 'txn1002', 1, 2.0, 20000, "DONE"),
    (UUID..., 'txn1003', 1, 0.75, 7500, "DONE")
ON CONFLICT (id)
DO UPDATE SET
    status = EXCLUDED.status,
RETURNING id, user_id, product_id, product_amount, total_price, status
CASE WHEN xmax::text::int > 0 THEN 'Update' ELSE 'Insert' END AS operation_type;


که طبق تابعی که نوشتم  میتونید متوجه شین update بوده یا insert.
نکته مهم سوال اینه که
۱. با upsert آشنا باشین
۲. با returning آشنا باشین
۳. با on conflict آشنا باشین