나는 이렇게 학습한다/DB 20

Supabase의 RPC를 활용해 실시간 카운터 기능 구현하기

제가 최근에 만든 서비스는 홈 화면에 사용자들의 이용 수 보여주고 있습니다.이처럼 사용자의 이용 수를 카운트하여 보여주고 흥미를 끄는 방식이 있는데요. 이런 카운트 기능을 어떻게 구현할까 고민하다 supabase의 RPC를 이용해 구현해 보았습니다. 이 글은 그 과정에 대해 설명하는 글입니다. 이 글을 끝까지 읽으면 꼭 카운터가 아니더라도 비슷한 상황에서 적절히 사용하실 수 있을 겁니다.  사용자가 버튼을 클릭하면 숫자를 올려줘처음에는 이 기능을 이용 중에 생성된 DB row의 수를 기준으로 숫자를 카운트했습니다. 하지만 이 row는 서비스를 끝까지 이용했을 때에만 생성되기 때문에 중간에 이탈한 사용자의 수는 숫자로 카운트되지 않았죠.. 그래서 버튼을 클릭하자마자 숫자가 올라가도록 수정했습니다. 먼저 ..

Sqlalchemy 의 scalar 메서드들을 살펴보자

Scalar 메서드는 쿼리를 통해 가져온 결과를, 단일 데이터 요소(ex. ORM)로 반환하는 데 사용하는 sqlalchemy.engine.Result 클래스의 메서드입니다. 이번 글에서는 SQLAlchemy에서 제공하는 Scalar 메서드들에 대해 알아보고, 각 메서드들의 적합한 예시를 함께 살펴보겠습니다. 🥸 scalar() scalar() 메서드는 쿼리 결과의 첫 번째 행의 값을 반환합니다. 만약 결과가 없으면 None을 반환합니다. scalar() 메서드는 주로 결과가 최대 하나만 있을 것으로 예상되거나, 여러 결과 중 첫 번째 값만 필요한 경우에 사용됩니다. 예시: 특정 조건을 만족하는 첫 번째 사용자의 이름 조회 first_user_name = session.query(User.name).fi..

Sqlalchemy 에서 joinedload 할 때, The unique() method must be ... 에러 해결방법

Sqlalchemy 로 ORM 영역에서 join 을 하려고 할 때 joinedload 를 자주 사용한다. 그런데 joinedload 방식은 복수의 ORM 객체를 불러올 때에 다음처럼 에러가 발생할 수 있다. sqlalchemy.exc.InvalidRequestError: The unique() method must be invoked on this Result, as it contains results that include joined eager loads against collections 결론부터 말하자면 메시지의 내용대로 unique() 를 추가하면 된다. 아래처럼 말이다. ... res = await session.execute(stmt) res.scalars().all() # X res.sca..

SQLAlchemy _ ForeignKey 로 연결된 개체 한 번에 삭제하기

SQLAlchemy에서는 cascading 옵션을 활용하여 관계된 개체(Entity)를 한 번에 삭제할 수 있다. 방법 1. 부모 relationship 에서 cascade 매개변수 지정 두 테이블 간의 관계를 정의할 때, 상위 개체와 하위 개체가 함께 삭제되도록 cascade 매개변수를 지정할 수 있다. from sqlalchemy import Column, Integer, ForeignKey from sqlalchemy.orm import relationship class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) children = relationship('Child', cascade='delete') ..

데이터베이스에서 인덱스는 왜 사용하는 걸까?

인덱스란? 인덱스는 데이터베이스에서 테이블의 검색 성능을 높여주는 방법입니다. 관계형 데이터베이스에서는 B+Tree구조로 된 index를 사용하여 검색 속도를 향상시킵니다. 특히 select ~ where 쿼리처럼 특정 데이터를 찾을 때 빠른 속도로 검색할 수 있게 해 줍니다. 인덱스의 구조 인덱스는 Btree, B+tree(대부분), Hash, Bitmap로 구현할 수 있습니다. 인덱스를 생성하면 특정 컬럼(속성)의 값을 기준으로 정렬하여 데이터의 물리적 위치 주소와 함께 별도 파일에 저장합니다. 이때 특정 컬럼을 'search-key'라고 하고 실제 데이터의 물리적 위치 값을 'pointer'라고 합니다. 보통 인덱스는 테이블 크기의 10% 정도의 저장 공간을 차지합니다. 인덱스를 사용하는 이유 테이..

트랜젝션이란?

트랜젝션은 무엇인가요? 트랜젝션은 데이터베이스에서 수행하는 작업의 최소 단위로 데이터베이스의 ‘무결성’을 유지합니다. 트랜젝션은 하나 의상의 쿼리를 포함하고 ACID라는 원자성, 일관성, 고립성, 지속성의 4가지 규칙을 만족해야합니다. *무결성이란? 데이터의 일관성과 정확성을 지키는 것 원자성 Atomicity : 트랜젝션은 all or nothing, 전부 수행되거나 아니면 전부 수행되지 않거나 둘 중 하나여야 합니다. 즉, 원자성은 더 이상 쪼개질 수 없는 최소의 작업 단위를 의미합니다. 일관성 Consistency : 트랜젝션이 성공하면 언제나 일관성 있는 데이터베이스 상태를 유지해야함을 의미합니다. ex. 두 잔액의 합이 변하는 경우, 숫자필드가 문자필드로 변하는 경우 일관성이 없다고 할 수 있다..

RDB와 NoSQL를 차이

RDB란? 관계형 데이터베이스는 엄격하게 정의된 스키마를 요구하는 테이블 기반 데이터 구조입니다. 엄격한 스키마로 데이터 중복이 없고, 데이터를 유지보수하는데 효율적입니다. 다만, 시스템이 커지면 join문이 복잡해지고 성능 향상을 하려면 스케일 업만 가능하여 비용이 크게 발생합니다. *스키마(schema)는 데이터베이스에서 자료의 구조, 자료의 표현 방법, 자료 간의 관계를 형식 언어로 정의한 구조입니다. -위키- 그렇다면 NoSQL은 무엇일까요? NoSQL은 테이블 구조가 아닌 비정형 데이터를 저장할 수 있습니다. 유연하고 자유로운 데이터 구조이나 데이터 수정시 모든 컬렉션에서 수정이 필요하기 때문에 update가 적고 조회가 많은 경우에 유리합니다. 이 둘은 언제 사용하는게 좋을까요? RDB 데이터..

관계형 데이터베이스의 key 종류

Table (=Relation) 하나의 셀에는 단일 값을 갖습니다. 각 row는 동일하지 않습니다. *column (=어트리뷰트) *row (=튜플, 레코드) col 1 col 2 row 1 row 2 기본키 (Primary key) 후보키 중에 선택한 유일성, 최소성을 만족하는 키입니다. Null값과 중복 값을 가질 수 없습니다. 슈퍼키 (Super key) 슈퍼키는 각 row를 식별할 수 있는 하나 혹은 그 이상 컬럼들의 집합입니다. (=유일성) 예시 :: (이름, 학번), (학번), (주민번호, 이름, 학번) 후보키 (Candidate key) 각 row를 유일하게 식별하여 Primary key로 사용할 수 있는 컬럼들을 말합니다. (=최소성) 예시 :: (학번), (주민번호) 대체키 (Altern..

물리삭제와 논리삭제를 코드로 구현해 보았다.

삭제에는 두 가지 방법이 있다. 물리삭제는 실제 데이터베이스에서 제거하는 것이고, 논리삭제는 같은 테이블에 '삭제플레그'의 값을 변경하여 실제 삭제된 것과 동일하게 처리하는 방식이다.(이 외에도 논리삭제의 방법은 다양하다) 코드로 구현해 본다면? 깃헙 링크 (깃헙 링크에 들어가면 코드를 모두 볼 수 있다.) @app.route("/snack/", methods=["DELETE", "PUT"]) def delete(id): if request.method == "DELETE": SnackDelete.delete_physics(id) elif request.method == "PUT": SnackDelete.delete_logical(id) result_value = SnackDelete.select_all..

생활코딩 #MySQL 클라이언트 Workbench, 수업을 마치며

오늘 배운 것 명령어 기반(MySQL Moniter) GUI 기반(MySQL Workbench) 보통 명령어 기반 서버를 사용한다. 그 이유는 GUI에 들어가는 리소스를 아끼기 위해서이다. 서로 장단점이 있다. 맥락에 따라 사용할 것. MySQL Workbench 설치링크 : https://dev.mysql.com/downloads/workbench/ 서버가 있고 클라이언트가 별도로 있다. 서버를 중심으로 정말 많은 클라이언트가 있다. 서버를 사용하는 모든 앱, 웹, 데이터 분석 시스템들은 본질적으로 모두가 '클라이언트' 이다. 이 세상에는 어마어마하게 많은 MySQL 클라이언트가 있다. 자신에게 잘 맞는 클라이언트를 만나자! 수업을 마치며 다음 공부거리 SQL(관계형DB) > CRUD > READ > ..