mysql 8

Q. 장고Django에서 같은 이름으로 인덱스index를 추가할 수 있을까?

A. 장고 2.2.x 버전에서는 추가할 수 있고, 장고 3.2.x 버전에서는 추가할 수 없다. 장고 버전 3.2.x에서 인덱스 name을 같은 이름으로 하면 유일한 이름이 아니라고 makemigrations에서 에러가 발생한다. 사례 예제 코드 DRF - CRUD를 활용해서 테스트 해보자. 테스트를 위해서 모델에 아래처럼 인덱스를 추가하자. class Category(models.Model): name = models.CharField(max_length=200) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: db_table = "category" ..

Q. MySQL에서 count(*)과 count()의 차이는?

A. count(*)은 WHERE 조건이 있다면 조건에 해당하는 모든 행수를 얻을 수 있고, count(칼럼명)의 경우는 해당 칼럼명의 데이터를 조회해서 NULL이 아닌 데이터가 들어 있는 행수를 얻을 수 있다. InnoDB 엔진 예 간단히 coffee란 테이블을 만들어서 5개의 데이터를 넣었다. 맨 마지막 5번 데이터는 NULL을 넣었다. 이 상태에서 SELECT count(*) FROM coffee; 를 실행하면 5가 나온다. 만약 칼럼명인 name으로 SELECT count(name) FROM coffee; 하게 되면 4가 결과로 나온다. 두 경우 모두 Query Cost를 살펴보면 0.75이고 Full Table Scan이 발생한다. SELECT count(*) FROM coffee; SELECT..

Q. MySQL 인덱스 타는지 안 타는지 확인하는 방법은?

A. Explain을 활용하면 쉽게 확인할 수 있다. 예를 들어서 아래와 같은 쿼리문이 인덱스를 타는지 궁금하다. SELECT beverage.name, beverage.price FROM beverage LEFT JOIN category ON beverage.category_id = category.id; 이때 SELECT 앞에 EXPLAIN만 붙여두면 확인할 수 있다. 아래 예처럼 말이다. EXPLAIN SELECT beverage.name, beverage.price FROM beverage LEFT JOIN category ON beverage.category_id = category.id; 실제 실행해보면 아래 예처럼 결과가 나온다. Extra에 나온 정보를 보면 Using index를 통해서 ..

도커로 mysql 컨테이너 만들어서 로컬 개발환경을 구축하기

API 서버 등 백엔드 개발을 하게 되면 데이터베이스가 필수다. 당연히 로컬에 mysql을 설치한다. 이때 설치하는 방법은 여러가지다. 그냥 mysql 사이트에 가서 내려받고 설치해도 되고, macOS 사용자라면 brew로 설치하기도 한다. 단일 사용자라면 괜찮지만, 한 컴퓨터를 여러 사람이 쓰거나 서로 다른 용도로 쓸 경우 문제가 발생한다. 도커Docker가 유용한 상황: 멀티 유저 예를 들어 개인 계정은 A, 회사 업무용 계정은 B라고 하자. A 계정에서 mysql을 brew로 설치했다. B 계정에서 brew로 뭔가 추가로 설치하려면 권한 설정 이슈가 빈번하게 발생한다. 또 서로 다른 계정인데도 데이터베이스도 함께 쓰게 된다. 물론 brew를 멀티 유저로서 문제 없게 쓰는 방법도 있지만 좀 번거롭다...

FastAPI 바탕 프로젝트: 이메일 회원 가입과 JWT 토큰, MySQL 사용

Full Stack FastAPI and PostgreSQL - Base Project Generator, MIT License을 바탕으로 다른 프로젝트의 시작점이 될 수 있는 베이스 프로젝트를 만들었다. 주요 기능 주요 기능은 다음과 같다. - 이메일과 비밀번호로 회원가입 - 비밀번호 암호화 - 관리자(superuser) 생성 - JWT 토큰으로 사용자 식별 및 권한 제어 - ORM 적용 - MySQL 사용 프로젝트 루트 디렉터리에 .env 파일을 만들어서 저장해둬야 정상 작동한다. .env 파일 예는 아래와 같다. 데이터베이스 정보와, 비밀키, 첫 관리자 생성 정보다. USERNAME=admin PASSWORD=verysecret HOST=localhost PORT=3306 DATABASE=app S..

Q. FastAPI에서 MySQL unsigned integer 길이 11로 하는 방법은?

A. Column(INTEGER(display_width=11, unsigned=True), primary_key=True, index=True)로 설정하면 된다. 위처럼 설정하기 위해서는 INTEGER를 불러와야 한다. 아래 코드가 그 예이다. from sqlalchemy.dialects.mysql import INTEGER class User(Base): __tablename__ = "users" id = Column(INTEGER(display_width=11, unsigned=True), primary_key=True, index=True) email = Column(String(255), unique=True, index=True) hashed_password = Column(String(255..

파이썬python에서 인기 있는 mysql 팩키지, PyMySQL

사용법이 아주 간단하다. 출처: github PyMySQL import pymysql.cursors # Connect to the database connection = pymysql.connect(host='localhost', user='user', password='passwd', database='db', cursorclass=pymysql.cursors.DictCursor) with connection: with connection.cursor() as cursor: # Create a new record sql = "INSERT INTO users (email, password) VALUES (%s, %s)" cursor.execute(sql, ('webmaster@python.org', 'v..

Google firebase Firestore의 아쉬운 점, 검색

Firestore 장점 서버리스. 서버 없이 앱 개발도 가능하다. 실시간 동기화와 오프라인 모드 지원. 여러 기기에 앱을 사용해도 자동 동기화된다. Firestore는 NoSQL 데이터를 문서 컬렉션으로 저장한다. 참고. Firebase 실시간 데이터베이스와 Firebase Firestore 비교 실제 개발해봤을 때 아쉬운 점. 검색 검색이다. MySQL 같은 보통 DBMS에서 제공해주는 검색이 안 된다. 특히 Like 검색이 안 된다. "a%" a로 시작하는 "%a" a로 끝나는 "%a%" 가운데 a가 있는 등의 검색이 안 된다. 간단한 쿼리들만 가능하다. Firestore 문서 익혀보고 코드 익히고 다 개발했는데, 시작할 때는 like 검색도 될 줄 알았는데... 역시 문서를 꼼꼼이 봐야하는 거 같다..