Python MSSQL 연동 pymssql 사용법

파이썬으로 MSSQL(SQL Server)와 연동하는 방법을 알아보겠습니다.

MSSQL 데이터베이스와 연동하기 위해 pymssql을 사용합니다.

pyodbc를 사용해 연결을 할 수도 있지만 리눅스 환경에 pyodbc를 설치할 때 에러가 발생하는 경우가 있습니다.

pymssql 설치와 관계는 없지만 pyodbc 설치할 때 발생한 에러 내용은 아래처럼 나왔습니다.

pip install pyodbc --user
Collecting pyodbc
Using cached pyodbc-4.0.17.tar.gz
Building wheels for collected packages: pyodbc
Running setup.py bdist_wheel for pyodbc ... error
Complete output from command /usr/bin/python -u -c "import setuptools, tokenize;file='/tmp/pip-build-YtLrrj/pyodbc/setup.py';f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, file, 'exec'))" bdist_wheel -d /tmp/tmp5eqhA5pip-wheel- --python-tag cp27:
running bdist_wheel
running build
running build_ext
building 'pyodbc' extension
creating build
creating build/temp.linux-x86_64-2.7
creating build/temp.linux-x86_64-2.7/src
x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -DPYODBC_VERSION=4.0.17 -DSQL_WCHART_CONVERT=1 -I/usr/include/python2.7 -c src/textenc.cpp -o build/temp.linux-x86_64-2.7/src/textenc.o -Wno-write-strings
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++ [enabled by default]
In file included from src/textenc.cpp:2:0:
src/pyodbc.h:56:17: fatal error: sql.h: No such file or directory
#include <sql.h>
^
compilation terminated.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

 

여러 가지 해결 방법을 찾아 해 봤지만 결국 해결이 안돼 pymssql을 설치해 사용해봤습니다.

다시 본론으로 돌아와 pymssql를 사용해 MSSQL과 연동하는 방법을 보겠습니다.

 

pymssql 설치

파이참을 사용하는 경우는 라이브러리를 검색해 설치합니다.

커맨드를 사용하는 경우에는 pip로 인스톨 가능합니다.

$ pip install pymssql

 

pymssql 사용법

pymssql을 사용해 파이썬과 MSSQL을 연결하는 방법을 알아보겠습니다.

import pymssql

# DB 서버 주소
server = 'DB IP'
# 데이터 베이스 이름
database = 'datebase name'
# 접속 유저명
username = 'user'
# 접속 유저 패스워드
password = 'pass'

# MSSQL 접속
cnxn =  pymssql.connect(server , username, password, database)
cursor = cnxn.cursor()
 
# SQL문 실행
cursor.execute('SELECT * FROM TEST;')

# 데이타를 하나씩 Fetch하여 출력
row = cursor.fetchone()

while row:
    print(row[0], row[1],  row[2])
    row = cursor.fetchone()

# 연결 끊기
cnxn.close()

 

결과

val1 val2 val3
data1 data2 data3
value1 value2 value3

 

SELECT를 사용해 데이터를 취득까지 해봤습니다.

SELECT문에서 검색 조건을 넣을 때도 그렇지만 INSERT나 DELETE문 등에서 변수값을 대입하고 싶은 경우가 있습니다.

pymssql을 사용하는 경우에는 ?로 대입을 하지 않습니다.

검색 조건 컬럼 또는 값을 대입하려는 컬럼의 데이터 타입을 지정합니다.

import pymssql

# DB 서버 주소
server = 'DB IP'
# 데이터 베이스 이름
database = 'datebase name'
# 접속 유저명
username = 'user'
# 접속 유저 패스워드
password = 'pass'

# MSSQL 접속
cnxn =  pymssql.connect(server , username, password, database)
cursor = cnxn.cursor()
 
crhstr = "data1"
cursor.execute('SELECT * FROM TEST WHERE col1 = %s ;' , crhstr)

# 데이타를 하나씩 Fetch하여 출력
row = cursor.fetchone()

while row:
    print(row[0], row[1],  row[2])
    row = cursor.fetchone()

# 연결 끊기
cnxn.close()

 

결과

data1 data2 data3

 

WHERE절에 사용한 col1 컬럼은 MSSQL에서 생성할 때 문자열 컬럼으로 지정했습니다.

검색 조건도 문자열로 지정을 해야 하기 때문에 %s를 사용해 crhstr 변수를 대입하도록 했습니다.

컬럼이 숫자 타입일 경우에는 %d를 지정해야 합니다.

종류데이터 타입내용
%d정수(십진수)Decima(0~9)
%f실수(소수점)Floating point number
%g정수 혹은 실수소수점의 여부에 따라 정소, 실수 자동표시
%s문자열String
%c문자Character

 

pyodbc보다 변수를 대입하는 것이 조금 번거로우니 주의해서 사용해야 합니다.

검색 결과는 fetchone()을 사용해 취득한 행만큼 반복문으로 처리하고 있습니다.

반복문에서는 해당 컬럼을 앞에서부터 순서로 인덱스를 통해 접근 가능합니다.

판다스 read_sql()을 사용해 dataframe 형태로 DB에서 값을 취득해오면 DB컬럼 이름을 사용해 접근할 수 있기 때문에 편리합니다.

read_sql() 사용 방법은 아래를 참조해주세요.

 

pymssql을 사용해 MSSQL과 연동하는 방법을 알아봤습니다.

접속 방법은 pyodbc와 크게 차이는 없는거 같습니다.

단지 쿼리문을 작성할 때 변수를 대입하는 처리가 조금 번거로운게 아쉽네요.

댓글