چرا پستگرس(Postgres)
اولا با دیتابیس Postgres کارهای زیادی میتوان کرد و این دیتابیس هم ویژگی های دیتابیس های SQL را دارد و هم NoSQL ، این دیتابیس به عنوان یک دیتابیس سری-زمانی(time-series) نیز کاربرد دارد و پراستفاده ترین دیتابیس در سیستم های بزرگ صنعتی نیز هست! ضمنا اولین دیتابیس SQL که ویژگی های ذخیره ی موثر موقعیت مکانی (GIS) را ارائه داد Postgres بود.
ویدیوی زیر را برای درک ارتباط عمیق Django و Postgres و چرایی انتخاب Postgres برای دیتابیس منتخب Django ببینید:
راه اندازی دیتابیس
فایل docker-compose.yml را ایجاد کنید و در آن بنویسید:
version: '3.9'
services:
web:
build: .
command: python /app/manage.py runserver 0.0.0.0:8000
volumes:
- .:/app
ports:
- 8000:8000
depends_on:
- db-postgres
environment:
- 'DJANGO_DEBUG=True'
- 'POSTGRES_URI=psql://postgres-user:postgres-password@db-postgres:5432/postgres-database'
db-postgres:
image: postgres:15.5
stdin_open: true
tty: true
restart: always
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
POSTGRES_PASSWORD: postgres-password
POSTGRES_DB: postgres-database
POSTGRES_USER: postgres-user
volumes:
postgres_data:
در فصل دوم از درایور postgresql از django.db.backends.postgresql به عنوان هسته ی ارتباط با دیتابیس استفاده کردیم. این هسته بسیار خوب است اما هسته ی بهتری نیز وجود دارد!
در ترمینال pipenv ابزار Psycopg 3 را نصب کنید
pipenv install "psycopg[binary]"
در فایل base.py تنظیمات دیتابیس را به شکل زیر تغییر دهید:
DEBUG = os.environ.get("DJANGO_DEBUG", True)
if DEBUG == True:
DB_URI = os.environ.get("POSTGRES_URI")
DATABASES = {
"default": DB_URI,
}
else:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": os.path.join(BASE_DIR, "db.sqlite3"),
}
}
خود جنگو با ساختار بالا تشخیص خواهد داد که از درایور psycopg استفاده کند!
در آینده قصد داریم این پروژه را به همراه SQLite دیپلوی کنیم و در این فصل دیتابیس توسعه ی ما بیشتر مناسب پروداکشن خواهد بود تا دیتابیس پروداکشن ما. این کار را به این خاطر انجام میدهیم که قصد داریم این سرویس را برای استفاده ی عمومی در دسترس توسعه دهندگان فرانت اند قرار دهیم که به صورت رایگان و متن باز از آن استفاده کنند.
بروز رسانی داکرفایل وگتیل:
ابتدا متغیر های محلی را کامل تر کنید(2 متغیر محلی دیگر باید به این فایل اضافه کنید)
سپس خط آخر را کامنت کنید!
نسخه ی پایتون را نیز به نسخه ی پایتون سیستم خود تغییر دهید
FROM python:3.10-slim-buster
نسخه ی gunicorn را حذف کنید و آن را به بعد نصب فایل requirements.txt منتقل کنید.
در نهایت داریم:
# Use an official Python runtime based on Debian 10 "buster" as a parent image.
FROM python:3.10-slim-buster
# Add user that will be used in the container.
RUN useradd wagtail
# Port used by this container to serve HTTP.
EXPOSE 8000
# Set environment variables.
# 1. Force Python stdout and stderr streams to be unbuffered.
# 2. Set PORT variable that is used by Gunicorn. This should match "EXPOSE" command.
# 3. If given, Python won’t try to write .pyc files on the import of source modules.
# 4. Newer versions of pip (v6+) check for updates to pip upon every invocation.
# This results in an increase in run-time (and also log spam),
# especially for projects that are testing compatibility with
# multiple versions of dependencies.
ENV PYTHONUNBUFFERED=1 \
PORT=8000 \
PYTHONDONTWRITEBYTECODE=1 \
PIP_DISABLE_PIP_VERSION_CHECK=1
# Install system packages required by Wagtail and Django.
RUN apt-get update --yes --quiet && apt-get install --yes --quiet --no-install-recommends \
build-essential \
libpq-dev \
libmariadbclient-dev \
libjpeg62-turbo-dev \
zlib1g-dev \
libwebp-dev \
&& rm -rf /var/lib/apt/lists/*
# Use /app folder as a directory where the source code is stored.
WORKDIR /app
# Install the project requirements.
COPY Pipfile Pipfile.lock /app/
RUN pip install pipenv && pipenv install --system
# Install the application server.
RUN pip install gunicorn
# Set this directory to be owned by the "wagtail" user. This Wagtail project
# uses SQLite, the folder needs to be owned by the user that
# will be writing to the database file.
RUN chown wagtail:wagtail /app
# Copy the source code of the project into the container.
COPY . .
# Use user "wagtail" to run the build commands below and the server itself.
USER wagtail
# Collect static files.
RUN python manage.py collectstatic --noinput --clear
# Runtime command that executes when "docker run" is called, it does the
# following:
# 1. Migrate the database.
# 2. Start the application server.
# WARNING:
# Migrating database at the same time as starting the server IS NOT THE BEST
# PRACTICE. The database should be migrated manually or using the release
# phase facilities of your hosting platform. This is used only so the
# Wagtail instance can be started with a simple "docker run" command.
# CMD set -xe; python manage.py migrate --noinput; gunicorn codingcogs_blog.wsgi:application
کارهای ضروری ارتباط با دیتابیس انجام شد. حالا نوبت به دیتابیس Redis برای cache می رسد!