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

در این آموزش، نحوه ساخت یک CRUD API ساده را با استفاده از آن یاد خواهید گرفت فلاسک، SQLAlchemy، و PostgreSQL.
فهرست مطالب
معرفی
چیز چندش و کثیف به چهار عملیات اساسی که یک برنامه نرم افزاری باید بتواند انجام دهد اشاره دارد: ايجاد كردن، خواندن، به روز رسانی، و حذف.
📝 توجه: این یک برنامه کم عمق با بهترین تمرین برای ساختار فایل است تا ایده بگیرید و شروع به یادگیری چارچوب کنید!
Flask vs Django: کدام چارچوب پایتون را انتخاب کنیم؟ در این مقاله می توانید تفاوت های دقیق بین جنگو و فلاسک را بیابید.
نتیجه آموزش
این آموزش یک برنامه Flask CRUD ایجاد می کند که به کاربران اجازه می دهد با استفاده از یک API ورودی های پایگاه داده را ایجاد، خواندن، به روز رسانی و حذف کنند. API قادر خواهد بود:
- لیست تمام نمونه های شی
- یک نمونه جدید ارسال کنید
- یک نمونه خاص بگیرید
- یک نمونه خاص قرار دهید
- یک نمونه خاص را حذف کنید
مراحل آموزش
- راه اندازی پروژه:
- ایجاد پایگاه داده PostgreSQL
- محیط مجازی را راه اندازی کنید
- Project Dependencies را نصب کنید
- نوشتن کد پروژه:
- نوشتن فایل های اصلی
- نوشتن فایل های برنامه ها
- ارسال درخواست با استفاده از 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) الگویی در طراحی نرم افزار است که معمولاً برای پیاده سازی رابط های کاربر، داده ها و منطق کنترل استفاده می شود. این بر جدایی بین منطق تجاری نرم افزار و صفحه نمایش تأکید می کند. این “تفکیک نگرانی ها” تقسیم کار بهتر و نگهداری بهتر را فراهم می کند.
پیش نیازها
راه اندازی پروژه
شماره 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 را تجزیه کنیم:
- با استفاده از تمام پرس و جوها دریافت کنید query.all() روش
- برای ذخیره نمونه ها در فهرستی از فرهنگ لغت، نتیجه را حلقه بزنید
- لیست را Jsonify کنید
- داده های درخواست ارسال شده در فرم درخواست را دریافت کرده و به فرهنگ لغت تبدیل کنید
- یک شناسه منحصر به فرد از کتابخانه uuid ایجاد کنید => https://docs.python.org/3/library/uuid.html
- یک نمونه جدید از کلاس با داده های فرم درخواست ایجاد کنید
- برای ذخیره نمونه جدید در پایگاه داده، جلسه را اضافه کنید و سپس Commit کنید
- بازیابی نمونه جدید توسط شناسه استفاده كردن query.get() روش
- نتیجه را به دیکشنری تبدیل کنید سپس آن را Jsonify کنید
- بازیابی نمونه توسط شناسه ارائه شده استفاده كردن query.get() روش
- نتیجه را به دیکشنری تبدیل کنید سپس آن را Jsonify کنید
- داده های درخواست ارسال شده در فرم درخواست را دریافت کرده و به فرهنگ لغت تبدیل کنید
- بازیابی نمونه توسط شناسه ارائه شده استفاده كردن query.get() روش
- فیلدهای نمونه را با داده های فرم درخواست به روز کنید
- جلسه را برای ذخیره نمونه با داده های جدید در پایگاه داده ما متعهد کنید
- بازیابی نمونه توسط شناسه ارائه شده استفاده كردن query.get() روش
- نتیجه را به دیکشنری تبدیل کنید سپس آن را Jsonify کنید
- یک نمونه خاص را حذف کنید:
- بازیابی نمونه توسط شناسه ارائه شده استفاده كردن query.filter_by() روش
- جلسه را متعهد کنید تا در پایگاه داده ما اقدامی انجام دهد
- بازگشت با یک پیام برای اطلاع کاربر از نتیجه
پنج عملیات کلی را می توان در دو 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 آنها خواهیم پرداخت!
- رابطه یک به چند
حساب ممکن است دارای چندین آیتم باشد، اما این مورد متعلق به یک حساب است!
💡 نکته: استفاده کنید
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")
- رابطه خیلی به یک
این آیتم ممکن است متعلق به حساب های زیادی باشد، اما حساب فقط یک آیتم دارد!
💡 نکته: استفاده کنید
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')
- رابطه یک به یک
حساب می تواند یک مورد داشته باشد و مورد متعلق به یک حساب است!
💡 نکته: استفاده کنید
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)
- رابطه خیلی به خیلی ها
حساب ممکن است دارای بسیاری از آیتم ها باشد، و آیتم ممکن است متعلق به حساب های بسیاری باشد!
💡 نکته: استفاده کنید
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 پیدا کنید.