이 글은 24.01.24에 본인 벨로그에 작성했던 글을 옮겨 온 것이다.
Python with MySQL
fetchone() // fetchall()
- 쿼리 실행 결과가 행(row)를 포함할 경우(예를 들어 쿼리가 select문인 경우), 해당 데이터(행, row)를 저장하고 읽어올 수 있도록 하는 함수.
fetchone()은 한 줄씩, fetchall()은 모든 줄을 읽거나 저장할 수 있음.
위 테이블의 데이터를(행/row를) fetchone()으로 한 줄씩 읽어와보자.
# AWS RDS 연결
remote = mysql.connector.connect(
host = endpoint 주소,
port = 포트 넘버,
user = 'username',
database = 'dbname',
password = 'password'
)
cur = remote.cursor() # 커서 생성
cur.execute('select * from sql_file;') # select문 실행.
result = cur.fetchone() # select문의 결과 중 맨 위 행 하나를 result에 담음
print(result) # 한 번 시행하면, 맨 위의 행을 담음. 2번 시행하면 그 다음 행을, 3번 시행하면 그 다음 행을 담음.
# 즉 result는 시행할 때마다 매번 달라짐. 이것이 fetchone()의 동작 원리.
remote.close() # 연결 해제
1번 실행
2번 실행
3번 실행
4번 실행
5번 실행(sql_file 테이블의 데이터는 4행 뿐이므로, 5번 이상의 시행부터는 None을 출력함)
조회할 행이 많다면, 이 얼마나 번거로운가! 이럴 때 쓰는 것이,
fetchall()이다. 한 번에 데이터를 불러올 수 있다.
아래와 같이 모든 행이 list형태로 출력된다. 한 줄씩 출력하고 싶다면 반복문을 사용하자.
(불러올 데이터가 많을 때엔 fetchall()에 buffered=True 옵션을 주자)
물론, 연결을 해제했다고 해서 result에 담긴 결과가 사라지는 것은 당연히 아니다.
그러므로 불러 온 데이터를 우리는 이리저리 활용해볼 수 있다.
예를 들어 아래와 같이 DataFrame을 만든다던가?
CSV file 다루기
sql로 csv파일도 다뤄보자. 아래의 데이터를 사용 할 것이다.
과정은 크게 다르지 않다.
sql에 연결 -> 커서 생성 -> 쿼리문 작성 후 실행 -> 잘 실행되었는지 확인 후 연결 해제
1. sql에 연결
2. 커서 생성(데이터가 클 지도 모르니 buffered 옵션 추가)
3. sql문 작성 후 실행
4. 확인 후 연결 해제.
물론 터미널로도 확인해볼 수 있다.
PK / FK
PK(기본키Primary Key)
- 테이블의 각 레코드를 식별하는 역할을 한다.
- 식별해야 하기 때문에, 중복되지 않는 고유값을 가진다.
- 따라서 Null값을 가질 수 없다
- 테이블 당 하나의 PK를 갖는다. 컬럼 하나를 PK로 지정할 수도, 여러개를 PK로 지정할 수도 있다.
PK 생성하기.
- 여러 개의 컬럼을 PK로 지정하는 경우(CONSTRAINT 줄은 생략 가능)
CREATE TABLE tablename(
col1 datatype NOT NULL,
col2 datatype NOT NULL,
......
CONSTRAINT constraint_name,
PRIMARY KEY(col1, col2, ...)
);
- 하나의 컬럼을 PK로 지정하는 경우
방법 1.
CREATE TABLE tablename(
col1 datatype NOT NULL,
col2 datatype NOT NULL,
......
PRIMARY KEY (col1)
);
방법 2.
CREATE TABLE tablename(
col1 datatype NOT NULL PRIMARY KEY,
col2 datatype NOT NULL,
......
);
- PK 삭제하기
ALTER TABLE tablename
DROP PRIMARY KEY;
PK 추가하기
ALTER TABLE tablename
ADD PRIMARY KEY(col1, col2, ...);
FK(외래 키Foreign Key)
- 한 테이블과 다른 테이블을 연결해주는 역할.
- 다른 테이블의 기본 키를 해당 테이블의 외래 키로 지정.