일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 스콜피온킹
- 폰폰테스트
- 킹덤 고근희
- 성남 코로나 확진자
- 제넥신
- 김영권
- 불가피
- 뭉쳐야 찬다
- 이태원 클라쓰 15회 예고
- 금리인하
- 김재석
- 최강욱
- 학교 개학 연기 4월
- 김영권 아내
- 홍혜걸
- 고민정
- libtins
- 스페인 코로나
- 양적완화
- 조희연
- 이지혜
- 이상형 만들기
- 해킹
- 임영규
- 은혜의 강 교회
- 미국 금리인하
- 리리남매
- 성남은혜의강교회
- 유튜버 김재석
- 픽크루
- Today
- Total
Dork's port
Python3 - SQLAlchemy 사용하기 본문
Draft Version. (연구하면서 틈틈히 업데이트할 것, 시간이 난다면 TEST DB의 테이블 구조 및 이름을 명시화 해서 코드를 작성하도록 하자)
Python에서 database 사용을 위해 SQL Alchemy를 사용하고자 한다.
# Connection |
Connection examples - http://docs.sqlalchemy.org/en/latest/core/engines.html#postgresql
나의 경우 mysql 및 python library의 pymysql 을 사용할 것이므로 아래와 같이 적으면 된다 (물론 라이브러리에서 sqlalchemy와 pymysql이 설치되어 있어야 하며, pymysql의 경우 cryptography의 의존성이 있으므로 마찬가지로 cryptography도 설치해 주자).
import sqlalchemy as db
engine = db.create_engine('mysql+pymysql://test:test123!!@db.database.com/db_name')
이때 패스워드가 @을 포함하는경우 그냥 적으면 되더라.
연결이 잘 되었는지 보기 위해 아래 코드를 추가한 후 실행해서 table의 column key들이 출력되면 정상적으로 연결은 완료되었다.
connection = engine.connect()
metadata = db.MetaData()
table = db.Table('table_name', metadata, autoload=True, autoload_with=engine)
print(table.columns.keys())
이때 table에는 DB에서 table_name에 해당하는 구조가 저장된다. 그래서 추후 이 TABLE을 이용해 읽거나, 쓰거나 할 수 있다.
또는 table에 해당하는 객체를 파이썬 코드로 만들어 줄 수 있으나, 필자의 경우 보통 DB 설계 및 생성 이후 코드를 이용하므로 번거롭게 직접 CREATE을 해주기 보다는 위의 코드를 이용하는게 편하다 (DB 설계 시 .sql 파일을 이용하여 설정이 가능하도록 파일을 생성하는데 이 부분을 파이썬 코드로 대체할 수 있을 것 같긴 하다).
# Query - SELECT |
이전까지는 연결에 대해 알아보았다. 그럼 Query를 날려서 Database에 있는 table의 정보를 가져와 보도록 하자.
table = db.Table('table_name', metadata, autoload=True, autoload_with=engine)
# select * from table 과 같음
query = db.select([table])
# 이때 query의 내용을 출력해보면 sql query인 것을 알 수 있음
print(query)
# 쿼리 실행
result_proxy = connection.execute(query)
result_set = result_proxy.fetchall()
# 결과 print 이때 10개만 출력하도록 함. 단순한 set 자료구조의 형태를 하고 있음.
print(result_set[:10])
select시 조건을 설정할 수 있다. 예로, password column의 값이 1234인것을 가져오려면 아래와 같이 코드를 수정하여 동작할 수 있다.
query = db.select([table]).where(table.columns.password == '1234')
또한, null check를 위해선 다음과 같이 할 수 있다.
query = db.select([table]).where(table.columns.password.isnot(None))
where 뿐만아니라 in, and, or, not, order by, functions, group by, cast, cast 등 mysql에서 지원하는 모든 조건문과 함수 등을 지원하는 것 같다. 이에 대한 내용이 궁금하다면 우측 하단의 참조 페이지를 참조하자.
# Query - INSERT |
다음으로 INSERT 문에 대해 알아 보도록 하자.
위에서 table 이라는 변수에 DB의 METADATA정보를 저장했다면 INSERT가 아주쉽다(pymysql만 사용하다가 SqlAlchemy를 이용한 주된 이유 중 하나다).
query = db.insert(table).values(values) # 이때 values는 table의 column의 순서와 갯수가 일치해야 함
result_proxy = connection.execute(query)
result_proxy.close()
또는, table이라는 db에 id, passwd, email이라는 column이 있다고 가정할때, id와 passwd만 INSERT 하고싶다면 (일부의 정보만 업데이트하고싶다면) 다음과 같이 하면된다.
query = db.insert(table).values(id='dork', passwd='1234')
result_proxy = connection.execute(query)
result_proxy.close()
INSERT에 대한 마지막 예제로 한꺼번에 많은 record를 넣고싶다면 다음 예제를 참조 하도록 하자.
query = db.insert(table)
values_list = [{'id': 'dork', 'passwd': '1234'}, {'id': 'test', 'passwd':'test123', 'email':'test@test.com'}]
result_proxy = connection.execute(query, values_list)
result_proxy.close()
위와 같이 List 자료구조 안에 Dictionary를 넣어주면 Dictionary의 수 만큼 한번에 INSERT할 수 있다.
우선 내 코드에서 필요한건 이 정도 까지 이므로 추후에 필요하면 주기적으로 업데이트 하도록 하겠다.
참조 : https://towardsdatascience.com/sqlalchemy-python-tutorial-79a577141a91
'Develop' 카테고리의 다른 글
Pyhon Class 테스트 (0) | 2020.07.16 |
---|---|
Python3 (SQL Alchemy) - MySQL server has gone away 에러 해결 (0) | 2020.03.11 |
TUN Interface의 패킷 캡처 중 앞에 헤더가 붙는 경우 (2) | 2019.07.29 |
Python에서 matplotlib이용 시 font type 변경하기 (2) | 2019.05.16 |
PyQt에서 QPlainText를 이용해 정보 출력하기(색상 변경) (2) | 2019.04.14 |