چرا پستگرس(Postgres)

اولا با دیتابیس Postgres کارهای زیادی میتوان کرد و این دیتابیس هم ویژگی های دیتابیس های SQL را دارد و هم NoSQL ، این دیتابیس به عنوان یک دیتابیس سری-زمانی(time-series) نیز کاربرد دارد و پراستفاده ترین دیتابیس در سیستم های بزرگ صنعتی نیز هست! ضمنا اولین دیتابیس SQL که ویژگی های ذخیره ی موثر موقعیت مکانی (GIS) را ارائه داد Postgres بود.

why 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 را نصب کنید

https://www.psycopg.org/psycopg3/docs/

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 --chown=wagtail:wagtail . .

# 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 می رسد!