0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【備忘録】PythonでMySQLのデータベースにデータを作成する方法

Last updated at Posted at 2024-02-05

備考

Python:3.9
MySQL:8.0.31
動作環境:MacOS
開発環境:PyCharm

事前準備

データベース作成済み

マイグレーション実行済み

1. PyCharmにて新規プロジェクトを作成する

2. プロジェクトを以下の構成になるようにファイルを作成する

フォルダ構成.
.
├── main.py
├── env.py
├── .env
├── requirements.txt
├── crud
│  ├── certification_crud.py
│  └── user_crud.py
├── database
│  ├── database.py
│  └── models.py
└── schema
   └── user_schema.py

3. requirements.txtファイルを以下の内容にする

requirements.txt
sqlalchemy
pydantic
passlib[bcrypt]
pytz
python-dotenv
mysqlclient

4. ターミナルにてコマンドを入力してモジュールをインストールする

ターミナル.
pip install -r requirements.txt

5. .envファイルを以下の内容にする

.env
# DB接続情報
DATABASE = 'mysql'
DB_USER = 'root'
DB_PASSWORD = 'MySQLのパスワード'
DB_HOST = 'localhost'
DB_PORT = '3306'
DB_NAME = '対象のDB名'

6. env.pyファイルを以下の内容にする

env.py
import os
from dotenv import load_dotenv
from os.path import join, dirname

dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)


class Env:
    # DB接続情報
    DATABASE = os.environ.get("DATABASE")
    DB_USER = os.environ.get("DB_USER")
    DB_PASSWORD = os.environ.get("DB_PASSWORD")
    DB_HOST = os.environ.get("DB_HOST")
    DB_PORT = os.environ.get("DB_PORT")
    DB_NAME = os.environ.get("DB_NAME")

7. database.pyファイルを以下の内容にする

database.py
from env import Env
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base

# データベースに接続するための情報
database_url = '{}://{}:{}@{}:{}/{}?charset=utf8'.format(Env.DATABASE, Env.DB_USER, Env.DB_PASSWORD, Env.DB_HOST, Env.DB_PORT, Env.DB_NAME)
engine = create_engine(database_url, connect_args={"connect_timeout": 15}, echo=False, pool_recycle=10, pool_size=10, max_overflow=20)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()


# データベースに接続するための処理
def db_session():
    return scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))

8. models.pyファイルを以下の内容にする

models.py
from database.database import Base
from datetime import datetime
from sqlalchemy import Column, VARCHAR, INT, TEXT, DATETIME
import pytz

jst = pytz.timezone('Asia/Tokyo')


# 仮にユーザーを用意
class User(Base):
    __tablename__ = 'users'
    __table_args__ = {"mysql_collate": "utf8_general_ci"}
    id = Column(INT, primary_key=True, autoincrement=True, unique=True, nullable=False, index=True)
    name = Column(VARCHAR(255), primary_key=False, autoincrement=False, unique=False, nullable=False, index=False)
    email = Column(VARCHAR(255), primary_key=False, autoincrement=False,  unique=True, nullable=False, index=True)
    password = Column(TEXT, primary_key=False, autoincrement=False, unique=False, nullable=False, index=False)
    create_time = Column(DATETIME, primary_key=False, autoincrement=False, unique=False, nullable=False, index=False, default=lambda: datetime.now(jst))

9. certification_crud.pyファイルを以下の内容にする

certification_crud.py
from passlib.context import CryptContext


# ハッシュ化などの処理を使用するために定義する
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")


# ユーザーが入力したパスワードをハッシュ化したバスワードにする
def create_password_hash(user_password: str):
    return pwd_context.hash(user_password)

10. user_crud.pyファイルを以下の内容にする

user_crud.py
from database import models
from schema import user_schema
from . import certification_crud
from sqlalchemy.orm import Session


# ユーザーを作成する処理
def create_user(db: Session, user: user_schema.CreateUser):
    db_user = models.User(**user.dict())

    # パスワードをハッシュ化する
    db_user.password = certification_crud.create_password_hash(db_user.password)

    db.add(db_user)
    db.commit()
    db.refresh(db_user)

    # 作成したユーザー情報を返す
    return db_user

11. user_schema.pyファイルを以下の内容にする

user_schema.py
from pydantic import BaseModel


# ユーザーを作成
class CreateUser(BaseModel):
    name: str
    email: str
    password: str

12. main.pyファイルを以下の内容にする

main.py
from database.database import SessionLocal
from crud import user_crud
from schema import user_schema

if __name__ == '__main__':

    print("データ作成を開始します")

    db = SessionLocal()

    # ユーザー作成
    user_data = [
        {
            "name": "TestUser1",
            "email": "TestEmail1@test.co.jp",
            "password": "TestPassword1",
        },
        {
            "name": "TestUser2",
            "email": "TestEmail2@test.co.jp",
            "password": "TestPassword2",
        },
        {
            "name": "TestUser3",
            "email": "TestEmail3@test.co.jp",
            "password": "TestPassword3",
        },
    ]

    users = []

    for user in user_data:
        db_user = user_crud.create_user(
            db,
            user_schema.CreateUser(
                name=user["name"],
                email=user["email"],
                password=user["password"],
            )
        )
        users.append(db_user)

    print("データ作成が完了しました")

13. ターミナルにてコマンドを入力してをデータ作成を実施する

ターミナル.
Python main.py
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?