Dork's port

Python3 - SQLAlchemy 사용하기 본문

Develop

Python3 - SQLAlchemy 사용하기

Dork94 2020. 2. 26. 20:03

Draft Version. (연구하면서 틈틈히 업데이트할 것, 시간이 난다면 TEST DB의 테이블 구조 및 이름을 명시화 해서 코드를 작성하도록 하자)

 

Python에서 database  사용을 위해 SQL Alchemy를 사용하고자 한다.

 

  # Connection 

 

 

Connection examples - http://docs.sqlalchemy.org/en/latest/core/engines.html#postgresql

 

Engine Configuration — SQLAlchemy 1.3 Documentation

The create_engine() function produces an Engine object based on a URL. These URLs follow RFC-1738, and usually can include username, password, hostname, database name as well as optional keyword arguments for additional configuration. In some cases a file

docs.sqlalchemy.org

 

나의 경우 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

 

Comments