برنامه نویسی

نحوه ساخت CRUD API با استفاده از Python Flask و SQLAlchemy ORM با PostgreSQL

در این آموزش، نحوه ساخت یک CRUD API ساده را با استفاده از آن یاد خواهید گرفت فلاسک، SQLAlchemy، و PostgreSQL.

فهرست مطالب

معرفی

چیز چندش و کثیف به چهار عملیات اساسی که یک برنامه نرم افزاری باید بتواند انجام دهد اشاره دارد: ايجاد كردن، خواندن، به روز رسانی، و حذف.

📝 توجه: این یک برنامه کم عمق با بهترین تمرین برای ساختار فایل است تا ایده بگیرید و شروع به یادگیری چارچوب کنید!

Flask vs Django: کدام چارچوب پایتون را انتخاب کنیم؟ در این مقاله می توانید تفاوت های دقیق بین جنگو و فلاسک را بیابید.

نتیجه آموزش

این آموزش یک برنامه Flask CRUD ایجاد می کند که به کاربران اجازه می دهد با استفاده از یک API ورودی های پایگاه داده را ایجاد، خواندن، به روز رسانی و حذف کنند. API قادر خواهد بود:

  • لیست تمام نمونه های شی
  • یک نمونه جدید ارسال کنید
  • یک نمونه خاص بگیرید
  • یک نمونه خاص قرار دهید
  • یک نمونه خاص را حذف کنید

مراحل آموزش

  1. راه اندازی پروژه:
    • ایجاد پایگاه داده PostgreSQL
    • محیط مجازی را راه اندازی کنید
    • Project Dependencies را نصب کنید
  2. نوشتن کد پروژه:
    • نوشتن فایل های اصلی
    • نوشتن فایل های برنامه ها
    • ارسال درخواست با استفاده از Postman

تعاریف

💡 نکته: از این تعاریف در اولین زمان خواندن صرف نظر کنید!

فلاسک چیزی است که به عنوان a شناخته می شود چارچوب WSGI. که مخفف آن است رابط دروازه وب سرور. اساساً، این راهی است که سرورهای وب درخواست‌ها را به برنامه‌ها یا چارچوب‌های وب ارسال می‌کنند.

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

  • چارچوب سبک وزن
  • استفاده کنید MVC الگوی طراحی
  • دارای سرور توسعه داخلی
  • دیباگر سریع ارائه شده است.

SQLAlchemy یک ” خوب ارائه می کندپایتونیک” روش تعامل با پایگاه های داده.

SQLAlchemy یک کتابخانه است که ارتباط بین برنامه های پایتون و پایگاه های داده را تسهیل می کند. بیشتر اوقات از این کتابخانه به عنوان یک کتابخانه استفاده می شود نگاشت رابطه ای شی (ORM) ابزاری که کلاس های پایتون را به جداول ترجمه می کند در پایگاه داده های رابطه ای و به صورت خودکار فراخوانی تابع را به دستورات SQL تبدیل می کند.

Alembic یک ابزار انتقال پایگاه داده سبک وزن برای استفاده با SQLAlchemy Database Toolkit برای پایتون است.

Alembic یک کتابخانه بسیار مفید است که به طور گسترده برای آن استفاده می شود مهاجرت پایگاه داده. می توان از آن برای ایجاد جداول، درج داده یا حتی انتقال توابع از یک طرحواره به طرح دیگر استفاده کرد. برای اینکه بتواند همه این وظایف را انجام دهد، کتابخانه از SQLAlchemy استفاده می کند، یک ORM که برای کار با PostgreSQL و سایر پایگاه های داده رابطه ای مناسب است.

Model-View-Controller (MVC) یک الگوی معماری است که یک برنامه کاربردی را به سه گروه اصلی از اجزاء تقسیم می کند: مدل ها، بازدیدها، و کنترل کننده ها.

MVC (Model-View-Controller) الگویی در طراحی نرم افزار است که معمولاً برای پیاده سازی رابط های کاربر، داده ها و منطق کنترل استفاده می شود. این بر جدایی بین منطق تجاری نرم افزار و صفحه نمایش تأکید می کند. این “تفکیک نگرانی ها” تقسیم کار بهتر و نگهداری بهتر را فراهم می کند.

نمودار MVC

پیش نیازها

راه اندازی پروژه

شماره 1 پایگاه داده PostgreSQL ایجاد کنید

هدف: یک پایگاه داده جدید با یک کاربر جدید ایجاد کنید.

💡 نکته: ابتدا یک پایگاه داده آزمایشی با نام ها و رمزهای عبور زیر ایجاد کنید، سپس می توانید یک پایگاه داده واقعی با نام ها و رمزهای عبور مورد نظر خود ایجاد کنید!

ما یک پایگاه داده به نام “testdb“و کاربر”کاربر تست“با رمز عبور”قبولی آزمون“.

1- در ترمینال ویندوز، سرور PostgreSQL را اجرا کنید

~ sudo service postgresql start
➜ * Starting PostgreSQL 14 database server
# 14 is the PostgreSQL Server Version
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

📝 نکته مهم: هر بار که شروع به کدنویسی می کنیم باید سرور PostgreSQL را اجرا کنیم!

2- پوسته PostgreSQL را فعال کنید

~ sudo -u postgres psql
➜ postgres=#
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3- یک پایگاه داده جدید ایجاد کنید

<!-- create database DBNAME; -->
postgres=# create database testdb;
➜ CREATE DATABASE
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4- یک کاربر پایگاه داده ایجاد کنید، سپس به آن امتیاز بدهید

<!-- create user USERNAME with encrypted password 'PASSWORD'; -->
postgres=# create user testuser with encrypted password 'testpass';
➜ CREATE ROLE

<!-- grant all privileges on database DBNAME to USERNAME; -->
postgres=# grant all privileges on database testdb to testuser;
➜ GRANT
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

5- از Shell خارج شوید

postgres=# \q
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

6- به New Database متصل شوید

~ psql -U testuser -h 127.0.0.1 -d testdb
Password for user testuser: testpass
➜ testdb=>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

7- Connection را بررسی کنید

testdb=> \conninfo
➜ You are connected to database "testdb" as user "testuser" on host "127.0.0.1" at port "5432".
<!-- We need this information later for the env file -->
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون که پایگاه داده جدید PostgreSQL ما راه اندازی شده است، بیایید به مرحله بعدی برویم!

شماره 2 محیط مجازی را راه اندازی کنید

  • محیط مجازی چیست؟

محیط مجازی ابزاری است که به جداسازی وابستگی های مورد نیاز پروژه های مختلف با ایجاد محیط های مجازی پایتون ایزوله برای آنها کمک می کند. این یکی از مهمترین ابزارهایی است که اکثر توسعه دهندگان پایتون از آن استفاده می کنند.

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

ما یک محیط مجازی ایجاد می کنیم و با استفاده از دستورات زیر آن را فعال می کنیم

# virtualenv -p python3 ProjectName
~ virtualenv -p python3 Flask-SQLAlchemy-PostgreSQL
➜ created virtual environment

cd Flask-SQLAlchemy-PostgreSQL

source bin/activate
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شماره 3 Dependencies پروژه را نصب کنید

پس از ایجاد و فعال سازی virtualenv، با نصب وابستگی های پروژه شروع می کنیم

pip install python-dotenv flask flask-sqlalchemy Flask-Migrate flask_validator psycopg2-binary
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس یک پوشه به نام src بسازید که حاوی کدهای پروژه باشد

mkdir src && cd $_
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آخرین مرحله قبل از شروع کد، با استفاده از این دستور یک فایل نیازمندی ایجاد کنید:

python -m pip freeze > requirements.txt
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نوشتن کد پروژه

📝 نکته: در Flask می‌توانید فایل‌ها را هر طور که دوست دارید ساختار داده و نام‌گذاری کنید، اما ما بهترین روش‌ها را برای نام‌گذاری و ساختاربندی فایل‌ها یاد خواهیم گرفت.

├── bin
├── include
├── lib
├── pyvenv.cfg
└── src
    ├── config.py
    ├── .env
    ├── .env.sample
    ├── __init__.py
    ├── app.py
    ├── accounts
    │   ├── controllers.py
    │   ├── models.py
    │   └── urls.py
    ├── items
    │   ├── controllers.py
    │   ├── models.py
    │   └── urls.py
    ├── requirements.txt
    └── README.md
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

# 1 شروع به کار با فایل های اصلی “app، __init__، config، env

در اکثر آموزش های Flask، متوجه خواهید شد که آنها فقط این را دارند app.py فایل، که کار می کند. با این حال، بهتر است چندین فایل داشته باشید، که پاک کردن کد و مدیریت فایل را به خصوص در پروژه های بزرگ بسیار آسان می کند.

بنابراین، اجازه دهید 4 فایل اصلی را با این دستور ایجاد کنیم:

touch app.py __init__.py config.py .env
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا بیایید شروع کنیم به غواصی عمیق تر در هر فایل:

نظر نامطلوب: برای شروع بهتر است config.py نسبت به. تا app.py

بیایید فرض کنیم که ما 4 حالت پیکربندی داریم: توسعه، آزمایش کردن، صحنه سازی، و تولید. ما برای هر کدام یک کلاس با مقادیر پیکربندی ایجاد می کنیم، می توانید Configuration — Flask-SQLAlchemy Documentation را بررسی کنید. مهمترین آنها این است SQLALCHEMY_DATABASE_URI که برابر با لینک اتصال پایگاه داده PostgreSQL است.

import os

class Config:
      SQLALCHEMY_TRACK_MODIFICATIONS = True

class DevelopmentConfig(Config):
      DEVELOPMENT = True
      DEBUG = True
      SQLALCHEMY_DATABASE_URI = os.getenv("DEVELOPMENT_DATABASE_URL")

class TestingConfig(Config):
      TESTING = True
      SQLALCHEMY_DATABASE_URI = os.getenv("TEST_DATABASE_URL")

class StagingConfig(Config):
      DEVELOPMENT = True
      DEBUG = True
      SQLALCHEMY_DATABASE_URI = os.getenv("STAGING_DATABASE_URL")

class ProductionConfig(Config):
      DEBUG = False
      SQLALCHEMY_DATABASE_URI = os.getenv("PRODUCTION_DATABASE_URL")

config = {
      "development": DevelopmentConfig,
      "testing": TestingConfig,
      "staging": StagingConfig,
      "production": ProductionConfig
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

متغیرهای محیطی را برای حالت پیکربندی و URL پایگاه داده را برای هر حالت ایجاد کنید.

# Configuration Mode => development, testing, staging, or production
CONFIG_MODE = development

# POSTGRESQL_DATABASE_URI => 'postgresql+psycopg2://user:password@host:port/database'
DEVELOPMENT_DATABASE_URL = 'postgresql+psycopg2://testuser:testpass@localhost:5432/testdb'
TEST_DATABASE_URL        =
STAGING_DATABASE_URL     =
PRODUCTION_DATABASE_URL  =
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

فرمت URL اتصال پایگاه داده PostgreSQL postgresql+psycopg2://user:password@host:port/database. این اطلاعات را می توان با استفاده از \conninfo دستور در پوسته psql.

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

from .config import config

db = SQLAlchemy()
migrate = Migrate()

def create_app(config_mode):
      app = Flask(__name__)
      app.config.from_object(config[config_mode])

      db.init_app(app)
      migrate.init_app(app, db)

      return app
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

create_app تابعی است که نمونه های زیر را نشان می دهد:

import os

# App Initialization
from . import create_app # from __init__ file
app = create_app(os.getenv("CONFIG_MODE"))

# Hello World!
@app.route("https://dev.to/")
def hello():
      return "Hello World!"

if __name__ == "__main__":
      app.run()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون برنامه اصلی ما آماده کار است! با استفاده از یکی از دستورات زیر می توانیم سرور را در ترمینال اجرا کنیم:

# To Run the Server in Terminal
flask run

# To Run the Server with specific host and port
# flask run -h HOSTNAME -p PORTNUMBER
flask run -h 127.0.0.2 -p 5001

# To Run the Server with Automatic Restart When Changes Occur
FLASK_DEBUG=1 flask run
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

می توانید مرورگر خود را در http://127.0.0.1:5000 باز کنید و نتیجه را ببینید!

#2 شروع به کار با فایل های برنامه ها

تمام دردها و سردردهای بالا برای اولین بار شروع پروژه است. اکثر کدها در داخل فایل های برنامه ها نوشته می شوند.

💡 نکته: بهترین تمرین این است که هر برنامه را در یک پوشه جداگانه قرار دهید.

هر برنامه باید برنامه خود را داشته باشد مدل ها، آدرس های اینترنتی، و کنترل کننده ها.

بیایید با ایجاد یک برنامه به نام Accounts با این دستور شروع کنیم:

mkdir accounts && touch $_/models.py $_/urls.py $_/controllers.py
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا بیایید همه این فایل ها را تجزیه کنیم:

💡 نکته: همیشه با ساخت کلاس های مدل شروع کنید

from sqlalchemy import inspect
from datetime import datetime
from flask_validator import ValidateEmail, ValidateString, ValidateCountry
from sqlalchemy.orm import validates

from .. import db # from __init__.py

# ----------------------------------------------- #

# SQL Datatype Objects => https://docs.sqlalchemy.org/en/14/core/types.html
class Account(db.Model):
# Auto Generated Fields:
      id           = db.Column(db.String(50), primary_key=True, nullable=False, unique=True)
      created      = db.Column(db.DateTime(timezone=True), default=datetime.now)                           # The Date of the Instance Creation => Created one Time when Instantiation
      updated      = db.Column(db.DateTime(timezone=True), default=datetime.now, onupdate=datetime.now)    # The Date of the Instance Update => Changed with Every Update

# Input by User Fields:
      email        = db.Column(db.String(100), nullable=False, unique=True)
      username     = db.Column(db.String(100), nullable=False)
      dob          = db.Column(db.Date)
      country      = db.Column(db.String(100))
      phone_number = db.Column(db.String(20))

# Validations => https://flask-validator.readthedocs.io/en/latest/index.html
      @classmethod
      def __declare_last__(cls):
          ValidateEmail(Account.email, True, True, "The email is not valid. Please check it") # True => Allow internationalized addresses, True => Check domain name resolution.
          ValidateString(Account.username, True, True, "The username type must be string")
          ValidateCountry(Account.country, True, True, "The country is not valid")

# Set an empty string to null for username field => https://stackoverflow.com/a/57294872
      @validates('username')
      def empty_string_to_null(self, key, value):
          if isinstance(value, str) and value == '': return None
          else: return value

# How to serialize SqlAlchemy PostgreSQL Query to JSON => https://stackoverflow.com/a/46180522
      def toDict(self):
          return { c.key: getattr(self, c.key) for c in inspect(self).mapper.column_attrs }

      def __repr__(self):
          return "<%r>" % self.email

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

درخواست های کلی CRUD عبارتند از:

  • لیست همه موارد
  • یک نمونه جدید ارسال کنید
  • یک نمونه خاص بگیرید
  • یک نمونه خاص قرار دهید
  • یک نمونه خاص را حذف کنید

هر یک از این عملیات باید عملکرد منطقی خود را در controllers.py فایل:

from flask import request, jsonify
import uuid

from .. import db
from .models import Account

# ----------------------------------------------- #

# Query Object Methods => https://docs.sqlalchemy.org/en/14/orm/query.html#sqlalchemy.orm.Query
# Session Object Methods => https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.Session
# How to serialize SqlAlchemy PostgreSQL Query to JSON => https://stackoverflow.com/a/46180522

def list_all_accounts_controller():
      accounts = Account.query.all()
      response = []
      for account in accounts: response.append(account.toDict())
      return jsonify(response)

def create_account_controller():
      request_form = request.form.to_dict()

      id = str(uuid.uuid4())
      new_account = Account(
                            id             = id,
                            email          = request_form['email'],
                            username       = request_form['username'],
                            dob            = request_form['dob'],
                            country        = request_form['country'],
                            phone_number   = request_form['phone_number'],
                            )
      db.session.add(new_account)
      db.session.commit()

      response = Account.query.get(id).toDict()
      return jsonify(response)

def retrieve_account_controller(account_id):
      response = Account.query.get(account_id).toDict()
      return jsonify(response)

def update_account_controller(account_id):
      request_form = request.form.to_dict()
      account = Account.query.get(account_id)

      account.email        = request_form['email']
      account.username     = request_form['username']
      account.dob          = request_form['dob']
      account.country      = request_form['country']
      account.phone_number = request_form['phone_number']
      db.session.commit()

      response = Account.query.get(account_id).toDict()
      return jsonify(response)

def delete_account_controller(account_id):
      Account.query.filter_by(id=account_id).delete()
      db.session.commit()

      return ('Account with Id "{}" deleted successfully!').format(account_id)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بیایید توابع منطقی برای عملیات CRUD را تجزیه کنیم:

  1. با استفاده از تمام پرس و جوها دریافت کنید query.all() روش
  2. برای ذخیره نمونه ها در فهرستی از فرهنگ لغت، نتیجه را حلقه بزنید
  3. لیست را Jsonify کنید
  1. داده های درخواست ارسال شده در فرم درخواست را دریافت کرده و به فرهنگ لغت تبدیل کنید
  2. یک شناسه منحصر به فرد از کتابخانه uuid ایجاد کنید => https://docs.python.org/3/library/uuid.html
  3. یک نمونه جدید از کلاس با داده های فرم درخواست ایجاد کنید
  4. برای ذخیره نمونه جدید در پایگاه داده، جلسه را اضافه کنید و سپس Commit کنید
  5. بازیابی نمونه جدید توسط شناسه استفاده كردن query.get() روش
  6. نتیجه را به دیکشنری تبدیل کنید سپس آن را Jsonify کنید
  1. بازیابی نمونه توسط شناسه ارائه شده استفاده كردن query.get() روش
  2. نتیجه را به دیکشنری تبدیل کنید سپس آن را Jsonify کنید
  1. داده های درخواست ارسال شده در فرم درخواست را دریافت کرده و به فرهنگ لغت تبدیل کنید
  2. بازیابی نمونه توسط شناسه ارائه شده استفاده كردن query.get() روش
  3. فیلدهای نمونه را با داده های فرم درخواست به روز کنید
  4. جلسه را برای ذخیره نمونه با داده های جدید در پایگاه داده ما متعهد کنید
  5. بازیابی نمونه توسط شناسه ارائه شده استفاده كردن query.get() روش
  6. نتیجه را به دیکشنری تبدیل کنید سپس آن را Jsonify کنید
  • یک نمونه خاص را حذف کنید:
  1. بازیابی نمونه توسط شناسه ارائه شده استفاده كردن query.filter_by() روش
  2. جلسه را متعهد کنید تا در پایگاه داده ما اقدامی انجام دهد
  3. بازگشت با یک پیام برای اطلاع کاربر از نتیجه

پنج عملیات کلی را می توان در دو URL مانند این ترکیب کرد:

from flask import request

from ..app import app
from .controllers import list_all_accounts_controller, create_account_controller, retrieve_account_controller, update_account_controller, delete_account_controller

@app.route("/accounts", methods=['GET', 'POST'])
def list_create_accounts():
      if request.method == 'GET': return list_all_accounts_controller()
      if request.method == 'POST': return create_account_controller()
      else: return 'Method is Not Allowed'

@app.route("/accounts/<account_id>", methods=['GET', 'PUT', 'DELETE'])
def retrieve_update_destroy_accounts(account_id):
      if request.method == 'GET': return retrieve_account_controller(account_id)
      if request.method == 'PUT': return update_account_controller(account_id)
      if request.method == 'DELETE': return delete_account_controller(account_id)
      else: return 'Method is Not Allowed'

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون، دو مرحله برای آماده کردن برنامه حساب‌های ما لازم است:

1- وارد کنید urls فایل در app.py

شکل نهایی از app.py فایل باید به شکل زیر باشد:

import os

# App Initialization
from . import create_app # from __init__ file
app = create_app(os.getenv("CONFIG_MODE"))

# ----------------------------------------------- #

# Hello World!
@app.route("https://dev.to/")
def hello():
       return "Hello World!"

# Applications Routes
from .accounts import urls

# ----------------------------------------------- #

if __name__ == "__main__":
       # To Run the Server in Terminal => flask run -h localhost -p 5000
       # To Run the Server with Automatic Restart When Changes Occurred => FLASK_DEBUG=1 flask run -h localhost -p 5000

       app.run()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2- مدل های پایگاه داده جدید را با این دستورات مهاجرت کنید:

flask db init
flask db migrate
flask db upgrade
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر با این خطا مواجه شدید: AttributeError: '_FakeStack' شیء هیچ ویژگی ندارد '__ident_func__'، سپس با این دستورات آن را برطرف کنید:

python -m pip uninstall flask-sqlalchemy
python -m pip install flask-sqlalchemy
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

می‌توانید درباره کتابخانه Flask-Migrate از https://flask-migrate.readthedocs.io/en/latest اطلاعات بیشتری کسب کنید.

شماره 3 ارسال درخواست با استفاده از Postman

در این بخش، ما از Postman برای آزمایش تمام عملیات CRUD که ایجاد کردیم استفاده خواهیم کرد.

پستچی چیست؟

Postman اپلیکیشنی است که به ما امکان می دهد تست API را انجام دهیم. مانند مرورگری است که HTML را رندر نمی کند. در مرورگر، فقط می‌توانیم درخواست‌های GET HTTP را بزنیم، اما در اینجا می‌توانیم GET، POST، PUT، DELETE و بسیاری از درخواست‌های HTTP دیگر را در API بزنیم.

Postman بزرگترین مرکز API عمومی جهان است. این یک پلت فرم API برای توسعه دهندگان است که می توانند API های خود را طراحی، ساخت، آزمایش و تکرار کنند.

ارسال اکانت جدید

لیست همه حساب ها

یک حساب کاربری خاص دریافت کنید

یک حساب کاربری خاص قرار دهید

حذف یک حساب خاص

با SQLAlchemy Basic Relationships شروع کنید

بیایید بگوییم که ما چندین برنامه مانند حساب ها & موارد و ما باید بین مدل های آنها رابطه برقرار کنیم!

📝 توجه: این یک خلاصه کوتاه از روابط مدل است، ما در مقاله دیگری به عملیات CRUD آنها خواهیم پرداخت!

  1. رابطه یک به چند

حساب ممکن است دارای چندین آیتم باشد، اما این مورد متعلق به یک حساب است!

💡 نکته: استفاده کنید ForeignKey در زیاد سمت!

class Account(db.Model):
     id = db.Column(db.String(50), primary_key=True, nullable=False, unique=True)
        .
        .
        .

# Relations:
     items = db.relationship("Item", back_populates='account')
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

class Item(db.Model):
     id = db.Column(db.String(50), primary_key=True, nullable=False, unique=True)
        .
        .
        .

# Relations:
     account_id = db.Column(db.String(100), db.ForeignKey("account.id"))
     account    = db.relationship("Account", back_populates="items")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. رابطه خیلی به یک

این آیتم ممکن است متعلق به حساب های زیادی باشد، اما حساب فقط یک آیتم دارد!

💡 نکته: استفاده کنید ForeignKey در زیاد سمت!

class Account(db.Model):
    id = db.Column(db.String(50), primary_key=True, nullable=False, unique=True)
       .
       .
       .

# Relations:
    item     = db.relationship("Item", back_populates="accounts")
    item_id  = db.Column(db.String(100), db.ForeignKey("item.id"))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

class Item(db.Model):
     id = db.Column(db.String(50), primary_key=True, nullable=False,
        .
        .
        .

# Relations:
     accounts = db.relationship("Account", back_populates='item')
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. رابطه یک به یک

حساب می تواند یک مورد داشته باشد و مورد متعلق به یک حساب است!

💡 نکته: استفاده کنید uselist=False در یک طرف و ForeignKey در طرف دیگر!

class Account(db.Model):
     id = db.Column(db.String(50), primary_key=True, nullable=False, unique=True)
        .
        .
        .

# Relations:
     item = db.relationship("Item", back_populates='account', uselist=False)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

class Item(db.Model):
     id = db.Column(db.String(50), primary_key=True, nullable=False, unique=True)
        .
        .
        .

# Relations:
     account    = db.relationship("Account", back_populates='item')
     account_id = db.Column(db.String(100), db.ForeignKey("account.id"), unique=True)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. رابطه خیلی به خیلی ها

حساب ممکن است دارای بسیاری از آیتم ها باشد، و آیتم ممکن است متعلق به حساب های بسیاری باشد!

💡 نکته: استفاده کنید Association کلاس با مولتی ForeignKey!

class Association(db.Model):
     item         = db.relationship("Item", back_populates="accounts")
     account      = db.relationship("Account", back_populates="items")
     item_id      = db.Column('item_id', db.String, db.ForeignKey('item.id'), primary_key=True)
     account_id   = db.Column('account_id', db.String, db.ForeignKey('account.id'), primary_key=True)

     def toDict(self):
        return { c.key: getattr(self, c.key) for c in inspect(self).mapper.column_attrs }

class Account(db.Model):
     id = db.Column(db.String(50), primary_key=True, nullable=False, unique=True)
        .
        .
        .

# Relations:
     items = db.relationship("Association", back_populates='account')
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

class Item(db.Model):
     id = db.Column(db.String(50), primary_key=True, nullable=False, unique=True)
        .
        .
        .

# Relations:
     accounts = db.relationship("Association", back_populates="item")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مفهوم از را بررسی کنید معکوس و back_populate در SQLalchemy از این پاسخ سرریز پشته.

نتیجه

در این پست به معرفی ORM ها به طور خاص SQLAlchemy ORM پرداخته ایم. با استفاده از Flask و Flask-SQLAlchemy، یک API ساده ایجاد کرده‌ایم که داده‌ها را در پایگاه داده PostgreSQL نمایش داده و دستکاری می‌کند. در نهایت، ما روابط اساسی SQLAlchemy را معرفی می کنیم.

کد منبع پروژه در این پست را می توانید در GitHub پیدا کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا