2. 아주대학교 의료정보학과에서 Python을 이용해 의료 연구에 쓰이는
Web Application을 만드는 일을 합니다.
지금은 Django를 이용해서 임상시험을 시뮬레이션하기 위한
시스템(AI-CTS) 을 개발 중입니다.
애니메이션, 게임 플레이, 음악 감상 좋아합니다.
Dev Django Korea 2018SQL Server에서 Django 를 추구하면 안 되는 걸까?
자기 소개
3. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
발표 제목은 이 작품 패러디이지만
시간이 없어 애니메이션 5분 밖에 못 봤네요.
4. 발표 배경
일하는 곳의 서버가 대부분 Windows Server와 SQL Server가 설치 되어 있었음.
게다가 Django에서는 SQL Server는 공식적으로 지원하지 않음.
?
SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
5. 다룰 내용
1. SQL Server 와 ODBC 알아보기
2. pyodbc를 이용해서 SQL Server 에 연결 및 쿼리 실행
3. django-pyodbc-azure를 이용해 SQL Server와 Django 연동
4. 사용하면서 생기는 문제 및 Tip, Raw SQL 사용법 공유
SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
6. Microsoft SQL Server 개요
• Microsoft 에서 만들고 관리하는 DBMS로 통칭 mssql
• Windows의 힘인지는 모르겠지만 생각보다 굉장히 많이
사용하고 있다.
• Linux 와 Mac에서도 사용할 수 있음.
• Developer 버전은 크기 제한이 없고 무료.
• Express 버전은 크기 제한이 10GB이지만 프로덕션 사용 가능.
https://db-engines.com/en/ranking/
SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
7. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
어떻게 설치하지?
• Windows 에서는 홈페이지에서 설치 파일을 다운로드해서 설치.
• Linux 도 홈페이지에서 주요 배포판 별로 설치 명령어 제공
• Mac 에서는 Docker로 구동해야 함.
• Linux 에서 설치할 때 메모리가 충분한지 확인 (메모리가 8GB 이상은 되야함)
(Amazon EC2에 직접 설치할 경우 t2.xlarge 권장)
8. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
어떻게 연결하지?
• SQL Server에서는 Windows 인증과 SQL Server 인증이라는 두가지 방식을 지원함.
• Windows 인증은 Windows 계정을 이용해서 접속을 시도하는 것.
• Local 에 설치된 SQL Server에 연결할 때 유용하다.
• SQL Server 인증은 다른 DBMS 처럼 아이디와 패스워드를 이용한 접속.
• 보통 ODBC를 이용해서 연결하지만 당연히 JDBC로도 연결이 가능함.
9. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
어떻게 사용하지?
• Windows 에서는 SQL Server Management Studio (SSMS) 라는 프로그램으로
관리 및 쿼리 실행 등 모든 기능이 가능하다.
• mssql-tools 나 mssql-cli 같은 명령줄 도구도 있음.
• VSCODE와 비슷한 Azure Data Studio 라는 오픈 소스 프로그램이 있어서 맥에서도 사용할 수 있다.
• Java 에서는 JDBC로 연결할 수 있고 다른 언어에서는 ODBC로 연결하는 걸 권장함.
• Microsoft 에서는 pyodbc 사용을 권장하고, 오늘 발표에도 이용하게 됨.
10. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
ODBC 란?
• ODBC는 Microsoft 에서 개발한 DB 접근을 위한 표준
규격이다.
• ODBC를 사용하면 드라이버만 있다면 어떤
DBMS에 연결하는 지 신경 쓰지 않고 쉽게 연결이
가능하다.
• pyodbc 는 Python 코드와 ODBC와의 다리 역할을
하게 된다.
https://www.simba.com/resources/odbc/
11. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
ODBC 사용법?
• Windows 에서는 왼쪽 같은 ODBC 데이터 원본
관리자 로 쉽게 사용 및 관리 가능하다.
• Unix 환경에서는 unix-ODBC 패키지 및 드라이버를
설치하고 터미널 명령어 및 파일로 관리하게 됨.
• ODBC의 장점은 Data Source Name(DSN) 을 미리
연결하고 싶은 데이터베이스를 위해 설정해
놓으면 DSN을 통해 쉽게 DB에 접속할 수 있다.
12. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
연결을 위한 준비
1. 발표자의 환경: Windows 10, SQL Server 2017 Developer
2. SSMS 를 이용해서 설정을 진행함.
3. SQL Server 인증 켜기 및 데이터베이스 만들기
4. 계정 / DSN 만들기
5. pyodbc 설치
14. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
SQL Server 인증 켜기
• 개체 탐색기->서버 속성->보안 탭
• 서버 인증 시 저렇게 SQL Server 인증을 동작시키지
않으면 SQL Server 인증이 불가능하다.
15. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
데이터베이스 만들기
• 개체 탐색기->데이터베이스->새 데이터베이스
• 데이터베이스 이름을 정하고 확인
• 옵션에서는 COLLATION(데이터 정렬) 등을 설정할 수
있고 한국어 Windows 면 한국어에 맞춘 기본값이
설정되어 있음.
• SQL Server 2017은 유니코드를 지원하므로
드라이버만 최신 버전을 사용하면 걱정하지 않아도
됨.
17. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
계정 만들기 – 서버 역할
• dbcreator 권한이 없을 경우 Django 단위 테스트
코드를 실행할 때 권한이 없어서 테스트가 실패함.
• 실행해야 할 단위 테스트 코드가 있다면 꼭
체크해주자.
18. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
계정 만들기 – 사용자 매핑
• 데이터베이스와 사용자를 매핑해준다.
• db_datareader, db_datawriter 권한은 당연히 있어야
함.
• db_ddladmin 권한은 스키마를 만들 일이 있을 경우
설정한다.
19. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
DSN
• ODBC에서는 Data Source Name (DSN) 을 만들어서 이용할 수 있다.
• DSN을 이용하면 코드 수준에서 어느 DB에 연결하고 있는지 신경 쓰지 않아도 되고 파일
단위로 재활용도 가능하다.
• Windows 에서는 ODBC 데이터 원본 관리자 를 이용해서 관리할 수 있다.
20. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
ODBC 데이터 원본 관리자
• 사용자 DSN과 시스템 DSN의 차이는 시스템
DSN은 모든 사용자가 공유한다는 차이뿐
• 파일 DSN 에서는 DSN을 저장하거나 저장된
DSN을 불러올 수 있음.
• 드라이버에서는 ODBC 드라이버를 관리
21. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
드라이버 사용
• 드라이버는 반드시 SQL Server Native Client 나
ODBC Driver * for SQL Server 사용
• SQL Server 같이 낮은 버전의 드라이버들은
인코딩 오류 등 뭔가 문제가 생길 수 있음.
22. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
Windows에서 DSN 만들기
• 데이터 원본 이름과 설명(필요없음) 서버 주소를
꼭 입력해야 함.
• 서버는 Dropdown 메뉴로 보이지만 선택하려는
순간 버그인지 누르는 순간 엄청 오래 걸리므로
반드시 그냥 입력할 것.
23. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
인증 방식 설정하기
• Windows 인증을 사용하면 현재 로그인한
Windows 계정을 이용하게 되므로 간편함.
• SQL Server 인증을 사용할 경우 ID와 암호를
입력한 후 다음 클릭
24. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
기본 데이터베이스 설정
• 기본 데이터베이스를 설정해주고 가는 것이
좋음.
• SQL Server 나 연결 시에 어떤 데이터베이스를 쓸
지 알 게 된다.
• 나머지는 넘어가도 됨.
25. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
서버 인증서를 신뢰합니다.
• 마침을 클릭하고 데이터 원본 테스트를 클릭했을
때
• 서버 인증서를 신뢰합니다 를 체크하지
않았다면 아래와 같은 에러가 발생 할 수 있음.
• 연결 string에 TrustServerCertificate=True 를
추가해도 됨.
26. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
pyodbc 설치하기
• Python 및 pip 설치하기
• Windows 에서는 ODBC 드라이버가 설치되었나 확인 (보통 설치되어 있음)
• Unix 환경에서는 C++ 코드를 빌드해야 하므로 g++ 가 필요하고
unixodbc 패키지도 설치해야 한다. 참고
• pip install pyodbc
27. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
pyodbc 연결 및 쿼리 실행하기
import pyodbc
# DSN + Windows 인증
conn = pyodbc.connect('DSN=devdjango;Trusted_Connection=yes;')
# DSN + SQL Server 인증
conn = pyodbc.connect('DSN=devdjango2;UID=thkim;PWD=1234')
# Windows 인증
conn = pyodbc.connect('SERVER=localhost;DATABASE=devdjango;DRIVER={ODBC Driver 13 for SQL
Server};Trusted_Connection=yes;')
# SQL Server 인증
conn = pyodbc.connect('SERVER=localhost;DATABASE=devdjango;DRIVER={ODBC Driver 13 for SQL
Server};UID=thkim;PWD=1234')
with conn.cursor() as cursor:
cursor.execute('SELECT * from names’)
rows = cursor.fetchall()
print(rows)
28. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
Django 와 SQL Server 연동하기
• Django에서는 django-pyodbc-azure 패키지를 통해서 SQL Server와 연동하게 된다.
• 이 패키지를 사용하면 postgresql 이나 MySQL 같이 Django에서 공식적으로 지원하는
DBMS처럼 SQL Server를 똑같이 쓸 수 있다.
• pip install django-pyodbc-azure
• 패키지 종속성에 pyodbc 가 포함되어 있으므로 Unix 환경에서는 pyodbc 설치를 위한
준비를 마쳐 놓아야 한다.
• 이 패키지는 Django 버전을 따라서 업데이트가 잘 되는 편이므로 Django 버전과 똑같이
맞춰서 설치하는 것이 좋음.
29. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
Django 에서 Windows 인증 (DSN 사용)
# OPTIONS에 Driver 를 설정하지 않은 이유는
# 기본적으로 "ODBC Driver 13 for SQL Server" 를 사용하기 때문입니다.
# 다른 드라이버를 쓰실 분들은 지정해주시면 됩니다.
# https://pypi.org/project/django-pyodbc-azure/
# DSN을 쓰더라도 Django에서 'NAME' 은 필수라 데이터베이스 이름은 넣어주셔야 합니다.
DATABASES = {
'default': {
'NAME': 'devdjango’,
'ENGINE': 'sql_server.pyodbc’,
'OPTIONS': {
'dsn': 'devdjango’
}
}
}
30. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
Django 에서 SQL Server 인증 (DSN 사용)
# DSN으로 SQL Server 인증 시 DSN에 아이디와 비밀번호가 설정되어 있어서
# 코드 상에 아이디와 비밀번호가 들어갈 필요가 없습니다.
DATABASES = {
'default': {
'NAME': 'devdjango’,
'ENGINE': 'sql_server.pyodbc’,
'OPTIONS': {
'dsn': 'devdjango2’
}
}
}
31. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
Django 에서 DSN 없이 Windows 인증
# SQL Server와 Django가 같은 서버에 있다면
# 간단히 Windows 인증 쓰셔도 좋을 것 같습니다.
DATABASES = {
'default': {
'NAME': 'devdjango’,
'ENGINE': 'sql_server.pyodbc’,
'HOST': 'localhost’
}
}
32. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
Django 에서 DSN없이 SQL Server 인증
# SQL Server 인증
# DSN 사용시와 달리 아이디와 비밀번호가 코드에 보입니다.
DATABASES = {
'default': {
'NAME': 'devdjango’,
'ENGINE': 'sql_server.pyodbc’,
'HOST': 'localhost’,
'USER': 'thkim’,
'PASSWORD': '1234’
}
}
33. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
ORM 및 다른 기능 사용
• 위와 같이 설정을 완료하면 Django ORM 및 manage.py 의 기능을 모두 쓸 수 있다.
• 지금까지 써오면서 모델 정의할 때 오류가 나는 필드는 없었음.
• 혹시 에러가 발생한다면 아래와 같이 로그가 찍히게 됨. MySQL 처럼 오류 코드를 보고
트러블 슈팅을 하면 된다.
django.db.utils.InterfaceError: ('IM002', '[IM002] [Microsoft][ODBC 드라이버 관리자] 데이터 원본 이름이 없고
기본 드라이버를 지정하지 않았습니다. (0) (SQLDriverConnect)')
django.db.utils.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]'fro'
근처의 구문이 잘못되었습니다. (102) (SQLExecDirectW)")
34. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
레거시 DB와의 사투
• 최적화도 덜 되어 있고 많은 데이터가 이미 있는 테이블을 이용하는 경우도 있다.
• 처음에는 그냥 inspectdb 를 사용해서 자동으로 Model 코드를 생성하고 ORM을 사용하려고
했는데 기본키나 외래키조차 걸려있지 않는 테이블이 많았음.
• 그래서 어느정도 Raw SQL을 많이 사용할 수 밖에 없었음.
• ORM이 필요할 경우 테이블 명세를 정확하게 Model 코드를 짜서 테이블을 만들고 데이터를
복제했음.
• 드라이버가 설치되어 있다면 Windows에서 SQL Server 가져오기 및 내보내기 마법사 를
사용할 수 있음.
35. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
로컬에 개발 DB를 둘 수 없을 때
• 병원 정책 상 데이터를 개발 PC에 둘 수가 없어 곤란한 상황이었음.
• 처음에는 한 DB를 공유했는데 마이그레이션 시에 점점 꼬이게 됨
• Django 에서 관리(managed=True)하는 테이블은 절대로 SQL이나 SSMS에서 테이블 디자인을
수정하지 말 것.
• 혹시 부득이하게 수정했을 경우 migrate –fake 를 사용하거나 임시로 오류를 해결하기
위해서 테이블을 고치면 된다.
• 최선은 개발자마다 DB나 스키마를 분리하고 DSN을 따로 만들어서 쓰면 편리하다.
36. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
트랜잭션 로그가 꽉 찼을때
• SQL Server도 트랜잭션 기능이 있고 코드 상의 @transaction 데코레이터도 동작한다.
• 개발할 때 테스트하면서 중간에 쿼리를 끊어버리는 때가 많다 보니 트랜잭션 로그가 꽉차게
됨.
(9002 에러가 발생)
• 로그 파일을 옮겨버리거나 SQL Server에서 로그 파일 최대 크기를 늘려줘야 함.
• https://bit.ly/2NpXujr
37. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
스키마는 어떻게 다루나요?
• postgresql 처럼 한 데이터베이스 안에서 여러 스키마를 쓸 수 있다.
• 당황하지 말고 트랜잭션 로그를 백업하고 충분한 공간을 확보해준다.
• SQL을 사용할 경우는 [스키마이름].[테이블이름] 식으로 쿼리를 날리면 된다.
• ORM을 쓰려면 원하는 스키마와 대응되는 SQL Server 로그인 계정을 만들고 Django Multi
Database 설정을 활용해서 스키마를 쓰고 싶을 때 해당 설정을 쓰면 된다.
38. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
새 스키마를 위한 계정 만들기
• 새로운 스키마를 위한 계정을 만들어준다.
• 기본스키마 아래에 있는 . 을 클릭
39. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
계정을 위한 스키마 설정하기
• 새로 뜬 창에서 찾아보기->개체 찾아보기에서
방금 만든 스키마 선택
• 스키마는 CREATE SCHEMA 스키마네임 으로
만들거나 데이터베이스에서 보안->스키마에서
만들 수 있다.
• 이렇게 새 계정을 만들고 이 계정에 대해서 DSN을
만들고 Django에서 연결하면 된다.
40. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
Django 와 새 계정 연동
DATABASES = {
'default': {
'NAME': 'devdjango',
'ENGINE': 'sql_server.pyodbc',
'OPTIONS': {
'dsn': 'devdjango'
}
},
'devdjango': {
'NAME': 'devdjango',
'ENGINE': 'sql_server.pyodbc',
'HOST': 'localhost',
'USER': 'thkim_new',
'PASSWORD': '1234'
}
}
• devdjango 설정이 방금 별도의 스키마로 설정한 계정과
연동되어 있음.
• 이와 같이 설정한 후 migrate –-database=devdjango 를
하면 해당 스키마에 대해서 마이그레이션이
이루어진다.
• ORM을 쓸떄는 object.save(using=devdjango) 나
Table.objects(using=devdjango) 처럼 쓰면 해당 스키마와
연동된다.
• 멀티 DB에 대한 자세한 사용법은 링크를 참고
41. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
Raw SQL 사용하기
• SQL Server에서 쓰는 SQL은 TSQL이라고 함.
• 다른 DBMS의 SQL과 비슷하지만 독자적인 문법이나 내장함수도 있다.
• Raw Query 를 사용할 때는 from django.db import connection 을 임포트하고 pyodbc에서
했던 것처럼 할 수 있다.
• django-pyodbc-azure 로 연결되서 만들어진 cursor는 순수 pyodbc 에서 만들어진 커서와
기능이 똑같다.
42. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
쿼리 결과의 컬럼 이름을 알고 싶어요
• cursor.description 에는 쿼리 결과의 컬럼명 및 타입이 담겨 있음
• 아래 함수를 이용해서 쉽게 각 column 별로 매칭된 값이 들어있는 리스트를 만들 수 있음.
def dict_fetchall(cursor):
"""
Return all rows from a cursor as a dict
:param cursor:
:return: Result of cursor.fetchall() to Dictionary
"""
columns = [col[0] for col in cursor.description]
return [
dict(zip(columns, row))
for row in cursor.fetchall()
]
43. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
dict_fetchall 함수 쓰기
with connection.cursor() as cursor:
cursor.execute('SELECT * FROM sample_test')
rows = cursor.fetchall(cursor)
print(rows)
[(1, 'asdasd'), (2, 'asdasddsfdsf'), (3, 'asdasd'), (4, 'asdasdxcv')]
with connection.cursor() as cursor:
cursor.execute('SELECT * FROM sample_test')
rows = dict_fetchall(cursor)
print(rows)
# 위 결과와 달리 컬럼명 별로 매핑되어 있음
[{'id': 1, 'name': 'asdasd'}, {'id': 2, 'name': 'asdasddsfdsf'}, {'id': 3, 'name': 'asdasd'},
{'id': 4, 'name': 'asdasdxcv'}]
44. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
한 SQL에 Select 문이 두 개 이상이라면?
• cursor.nextset() 이라는 메서드는 다음 SELECT 문이 있다면 커서를 이동시키고 True를
반환한다.
• 그래서 이 함수의 문제점은 처음 한 번은 fetch를 해줘야함.
• 그런데 Python 에는 do-while 문이 없으므로 아래처럼 코드를 작성해야 한다.
with connection.cursor() as cursor:
cursor.execute(sql)
result = dict_fetchall(cursor)
...
while cursor.nextset():
result = dict_fetchall(cursor)
...
45. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
SQL 문법은 맞는데 오류가 나올떄
• 분명히 SQL 문법오류는 없는데 아래와 같은 에러가 나올 때가 있다.
• SQL을 SSMS 에서 실행하면 * 개 행이 표시됨처럼 row의 숫자를 세 줄 때가 있다.
• Fetch를 하면 pyodbc가 위 메시지를 인식하기 때문에 에러가 나오는 것임.
• SQL 맨 위에 SET NOCOUNT ON 구문을 삽입하면 문제 없이 동작한다.
`No results. Previous SQL was not a query.`
46. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
SQL Server를 썼을 때 장점
1. Windows 에서 MySQL 이나 다른 RDBMS 들을 활용하려면 어려움이 있을 수 있는데 역시
MS에서 만든 것이라 Windows와 완벽히 호환됨.
2. SSMS에서 쿼리 실행이나 데이터베이스 관리 같은 동작을 모두 수행할 수 있다. pgAdmin
이나 다른 DBMS의 프로그램보다 훨씬 뛰어난 기능을 많이 제공함.
3. django-pyodbc-azure 패키지를 통해서 Django 에서도 ORM 등 Django 의 기능을 대부분
활용할 수 있다.
47. SQL Server에서 Django 를 추구하면 안 되는 걸까? Dev Django Korea 2018
SQL Server를 썼을 때 단점
1. 공식적으로 지원되는 DBMS가 아님
2. SQL Server 는 좋은 DBMS가 맞지만 기능이 방대하고 관리 소요가 꽤 들어가는 편이다. 그리고
postgres처럼 Django 자체에서 제공하는 기능이 있는 것도 아님.
3. Unix 에서 SQL Server를 설치하고 사용할 수 있긴 하지만 DSN을 만들고 관리하는 것은 꽤나 불편한
측면이 많다.
4. 실제로 Django와 SQL Server를 함께 운용하는 경우가 적어서 그런지 정보 검색이 힘든편.