• 질문
    • 주식 매매 관리 프로그램을 만들어 보려고 하고 있어. python을 이용해서 만들려고 하는데 주식 종목별로 계좌 잔고, 매매내역, 수익현황, 배당금 수령 현황등을 저장하는 database를 만들려고 하는데, database schema를 제안해줘.
  • 답변
    • 흥미로운 프로젝트네요! 주식 매매 관리 프로그램을 위해 필요한 데이터베이스 스키마를 제안드릴게요. 아래는 기본적으로 필요한 테이블과 각 테이블의 구조입니다:

테이블: 계좌(Account)

필드 이름데이터 타입설명
account_id INTEGER 기본 키
account_name TEXT 계좌 이름
balance REAL 계좌 잔고
creation_date DATE 계좌 생성일

테이블: 주식 종목(Stock)

필드 이름데이터 타입설명
stock_id INTEGER 기본 키
stock_symbol TEXT 종목 코드
stock_name TEXT 종목 이름

테이블: 매매 내역(Transaction)

필드 이름데이터 타입설명
transaction_id INTEGER 기본 키
account_id INTEGER 계좌 ID (외래 키)
stock_id INTEGER 주식 종목 ID (외래 키)
transaction_date DATE 거래 날짜
transaction_type TEXT 거래 유형 (매수/매도)
quantity INTEGER 거래 수량
price REAL 거래 가격

테이블: 수익 현황(Profit)

필드 이름데이터 타입설명
profit_id INTEGER 기본 키
account_id INTEGER 계좌 ID (외래 키)
stock_id INTEGER 주식 종목 ID (외래 키)
total_invested REAL 총 투자 금액
total_return REAL 총 수익 금액
profit_date DATE 수익 계산 날짜

테이블: 배당금 수령 현황(Dividend)

필드 이름데이터 타입설명
dividend_id INTEGER 기본 키
account_id INTEGER 계좌 ID (외래 키)
stock_id INTEGER 주식 종목 ID (외래 키)
dividend_amount REAL 배당금 금액
dividend_date DATE 배당금 수령 날짜

이 스키마는 주식 매매 관리 프로그램을 구축하는 데 필요한 기본적인 데이터베이스 구조를 제공합니다. 이를 기반으로 Python과 SQL을 사용해 데이터베이스를 생성하고 관리할 수 있습니다. 추가적으로 필요한 기능이나 데이터가 있다면 언제든지 말씀해 주세요! 😊

  • 질문
    • 제안해준 스키마를 이용해서 django를 이용해 backend server를 만들려고 하는데 model.py를 어떻게 만들면 좋을지 기본 코드를 제공해줘
  • 답변
    • Django를 사용해서 주식 매매 관리 프로그램의 backend server를 만들기 위해 model.py 파일의 기본 코드를 제공해 드릴게요. 아래는 제안해드린 스키마를 기반으로 한 Django 모델들입니다.
python
from django.db import models

class Account(models.Model):
    account_name = models.CharField(max_length=100)
    balance = models.DecimalField(max_digits=20, decimal_places=2)
    creation_date = models.DateField()

    def __str__(self):
        return self.account_name

class Stock(models.Model):
    stock_symbol = models.CharField(max_length=10)
    stock_name = models.CharField(max_length=100)

    def __str__(self):
        return self.stock_name

class Transaction(models.Model):
    account = models.ForeignKey(Account, on_delete=models.CASCADE)
    stock = models.ForeignKey(Stock, on_delete=models.CASCADE)
    transaction_date = models.DateField()
    transaction_type = models.CharField(max_length=4, choices=(('BUY', '매수'), ('SELL', '매도')))
    quantity = models.IntegerField()
    price = models.DecimalField(max_digits=20, decimal_places=2)

    def __str__(self):
        return f'{self.account.account_name} - {self.stock.stock_name} - {self.transaction_type}'

class Profit(models.Model):
    account = models.ForeignKey(Account, on_delete=models.CASCADE)
    stock = models.ForeignKey(Stock, on_delete=models.CASCADE)
    total_invested = models.DecimalField(max_digits=20, decimal_places=2)
    total_return = models.DecimalField(max_digits=20, decimal_places=2)
    profit_date = models.DateField()

    def __str__(self):
        return f'{self.account.account_name} - {self.stock.stock_name}'

class Dividend(models.Model):
    account = models.ForeignKey(Account, on_delete=models.CASCADE)
    stock = models.ForeignKey(Stock, on_delete=models.CASCADE)
    dividend_amount = models.DecimalField(max_digits=20, decimal_places=2)
    dividend_date = models.DateField()

    def __str__(self):
        return f'{self.account.account_name} - {self.stock.stock_name}'

위의 코드에는 5개의 모델이 포함되어 있으며, 각 모델은 데이터베이스 테이블에 매핑됩니다. ForeignKey를 사용하여 모델 간의 관계를 정의하였고, __str__ 메서드를 사용하여 객체의 문자열 표현을 정의했습니다.

이제, 이 모델들을 관리할 Django admin 패널이나 다른 로직을 추가하여 완전한 백엔드 서버를 구축하실 수 있습니다. 추가적인 도움이 필요하시면 언제든지 말씀해 주세요! 😊

반응형
  • 일반적인 HTS App 으로는 기업 찾기, 정리, 자산의 변화 등을 한 눈에 보는 것이 쉽지 않아 입맛대로 하나 만들어 보기로 했다.
  • 사용 솔루션
    • db : postgresql
    • backend : django
    • frontend : react
  • github
 

GitHub - goguma/my-hts

Contribute to goguma/my-hts development by creating an account on GitHub.

github.com

 

  • Docker compose 를 이용해서 db와 backend server 까지 뜨는 건 확인 완료
  • Reverse proxy를 이용하여 외부에서 접속되는 것도 확인 완료

  • 무리하지 말고 천천히 하나씩 기능을 넣어 봐야 겠다.
반응형
 

Dockerize Wagtail & PostgreSQL as a development environment

If you want to develop with Wagtail and PostgreSQL in a platform-independent way, using Docker is a good choice. In the following tutorial, I would like to share my approach.

www.phooky.com

  • 아래와 같은 문제가 생겼다.
(.venv) ➜ projectGoguma (main) ✗ docker-compose exec web python manage.py createsuperuser --settings=projectGoguma.settings.dev

You have 162 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, home, sessions, taggit, wagtailadmin, wagtailcore, wagtaildocs, wagtailembeds, wagtailforms, wagtailimages, wagtailredirects, wagtailsearch, wagtailusers.
Run 'python manage.py migrate' to apply them.
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "auth_user" does not exist
LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM "auth_user...
                                                             ^


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 436, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 412, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.8/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 88, in execute
    return super().execute(*args, **options)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 458, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.8/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 109, in handle
    default_username = get_default_username(database=database)
  File "/usr/local/lib/python3.8/site-packages/django/contrib/auth/management/__init__.py", line 168, in get_default_username
    auth_app.User._default_manager.db_manager(database).get(
  File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 633, in get
    num = len(clone)
  File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 380, in __len__
    self._fetch_all()
  File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1881, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 91, in __iter__
    results = compiler.execute_sql(
  File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1562, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 102, in execute
    return super().execute(sql, params)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 80, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "auth_user" does not exist
LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM "auth_user...
                                                             ^
  • 이리저리 다 수정을 한 것 같은데 왜 안될까???
  • docker container에 직접 attach를 해보니...
  • 엥???
(.venv) ➜ projectGoguma (main) ✗ docker ps -a
CONTAINER ID   IMAGE                  COMMAND                   CREATED              STATUS                   PORTS                                       NAMES
c281852e6c92   projectgoguma_web      "/app/entrypoint.sh …"   About a minute ago   Up About a minute        0.0.0.0:8000->8000/tcp, :::8000->8000/tcp   projectgoguma_web_1
06f0d1750419   postgres:13.5-alpine   "docker-entrypoint.s…"   About a minute ago   Up About a minute        0.0.0.0:5432->5432/tcp, :::5432->5432/tcp   projectgoguma_db_1
59ee14bdc489   hello-world            "/hello"                  3 weeks ago          Exited (0) 3 weeks ago                                               gallant_lamport
(.venv) ➜ projectGoguma (main) ✗ docker attach projectgoguma_web_1
/app/entrypoint.sh: 7: /app/entrypoint.sh: nc: not found
/app/entrypoint.sh: 7: /app/entrypoint.sh: nc: not found
/app/entrypoint.sh: 7: /app/entrypoint.sh: nc: not found
/app/entrypoint.sh: 7: /app/entrypoint.sh: nc: not found
/app/entrypoint.sh: 7: /app/entrypoint.sh: nc: not found
/app/entrypoint.sh: 7: /app/entrypoint.sh: nc: not found
/app/entrypoint.sh: 7: /app/entrypoint.sh: nc: not found
/app/entrypoint.sh: 7: /app/entrypoint.sh: nc: not found
/app/entrypoint.sh: 7: /app/entrypoint.sh: nc: not found
/app/entrypoint.sh: 7: /app/entrypoint.sh: nc: not found
/app/entrypoint.sh: 7: /app/entrypoint.sh: nc: not found
  • nc를 왜 필요로 하지?
  • 잘 모르겠지만 Dockerfile 에서 netcat 설치를 추가해 보니 문제 해결
# 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 \
    netcat \
    # environ \
    # postgresql-dev \
    # python3-dev \
    # musl-dev \
  • 잘된다.
(.venv) ➜ projectGoguma (main) ✗ docker-compose up -d --build                    
Building web
[+] Building 57.1s (14/14) FINISHED                                                                      docker:default
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 2.50kB                                                                             0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 418B                                                                                  0.0s
 => [internal] load metadata for docker.io/library/python:3.8.1-slim-buster                                        1.3s
 => [internal] load build context                                                                                  0.0s
 => => transferring context: 70B                                                                                   0.0s
 => [1/9] FROM docker.io/library/python:3.8.1-slim-buster@sha256:73f3903470a6e55202a6bb989c23b047487eb1728feba655  0.0s
 => CACHED [2/9] RUN useradd wagtail                                                                               0.0s
 => [3/9] RUN apt-get update --yes --quiet && apt-get install --yes --quiet --no-install-recommends     build-es  23.8s
 => [4/9] RUN pip install "gunicorn==20.0.4"                                                                       1.9s 
 => [5/9] COPY requirements.txt /                                                                                  0.1s 
 => [6/9] RUN pip install -r /requirements.txt                                                                    27.9s 
 => [7/9] WORKDIR /app                                                                                             0.0s 
 => [8/9] RUN chown wagtail:wagtail /app                                                                           0.3s 
 => [9/9] COPY entrypoint.sh /app/entrypoint.sh                                                                    0.0s 
 => exporting to image                                                                                             1.6s 
 => => exporting layers                                                                                            1.6s 
 => => writing image sha256:5f7b2c8cec2309bcf3f45e6a3938484c3d7c90b29cef5bcb0ffb787b14bbf6ef                       0.0s 
 => => naming to docker.io/library/projectgoguma_web                                                               0.0s
Creating projectgoguma_db_1 ... done
Creating projectgoguma_web_1 ... done
(.venv) ➜ projectGoguma (main) ✗ docker-compose exec web python manage.py createsuperuser --settings=projectGoguma.settings.dev
Username (leave blank to use 'wagtail'):
  • 떴다!!!

반응형

'django & Wagtail' 카테고리의 다른 글

Wagtail Tutorial  (0) 2023.08.14
Wagtail 설정 with postgreSql  (0) 2023.08.14

+ Recent posts