블로그 이미지
자유로운설탕

calendar

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

Notice

2017. 2. 18. 19:22 프로그래밍

  4번째 시간이다. 이번 시간에는 지난 시간에 구현을 위해 나눈 기능 중 DB 와의 연결 부분을 구현하기 위해 MSSQL Express DB 서버를 설치하고, 어플리케이션 용으로 이런 저런 세팅 후, 쿼리를 날려서 테이블 내의 값을 가져오려 한다. 아래의 3교시 그림을 기준으로 하면 회색 박스로 표시되 있는 MSSQL Database 항목이다.  MSSQL 설치 및 원격 연결 설정, DB 생성 및 사용자 생성 부분은 이미 아시거나 설치되어 있다면 건너뛰고 보면 되겠다. 풀버전으로만 설치해 보셨던 분들은 express 버전은 조금 다른 듯 하니 설정 부분만 보셔도 될듯 싶다.

 

 

[목차]

0. 왜 파이썬 공부에 구글을 이용하는게 좋은가?

1. 언어를 바라보는 방법. 파이썬을 어떻게 바라봐야 할까?

2. 파이썬 설치와 환경, 버전 선택 하기의 이유.

3. 만들고자 하는 기능을 모르는 조각으로 나눠 조사해 보기

4. 데이터 베이스에서 내용 가져와 출력하기

5. 암호화 모듈을 이용해 암복호화 해보기

6. 퍼즐 조각들을 합쳐보기

7. 엑셀 파일 사용해 보기 -> 부록 : fuction 을 이용해서, 코드 정리해 보기

8. 정규표현식을 왜 사용해야 할까? 언어속의 미니 언어 정규표현식 살펴보기

9. 입력과 결과를 GUI 화면과 연결해 보기

10. Whois API 이용해 보기

11. 웹페이지 호출해 내용 파싱 하기(BeautifulSoup 그리고 한계)

12. 자동화 - 웹 자동화(with Selenium)

13. 자동화 - 윈도우즈 GUI 자동화(with pywinauto)

14. 자동화 - 작업 자동화

15. 수학 라이브러리 살펴보기

16. 그래픽 라이브러리 살펴보기

17. 머신러닝에서의 파이썬의 역활

18. 웹 프로그래밍 - Legacy Web

19. 웹 프로그래밍 - Flask 살펴보기(feat. d3.js)

20. 웹 프로그래밍 - Django 살펴보기

21. 정리 - 이런저런 이야기

 

 

 

 

[들어가면서] 

  개인적인 의견이지만 파이썬을 사용하기 전에 perl(펄) 이라는 언어를 조금 사용하고 있었는데, 파이썬은 perl 이 현대적 스타일을 지니고 다시 태어난 듯한 느낌이 든다. perl 은 리눅스 쉘 환경을 언어로 축약해 놓은 것 같은 재밌는 느낌도 있고, 30년의 오랜 역사를 통해(파이썬도 25년이 됬다고 해서 놀랐다) 방대하게 축적된 라이브러리와 참고 가능한 코드들이 구글에 많아 필요한 기능을 만들기 편하다고 생각했는데(물론 파이썬 보다 축약적 표현을 많이 써서 코드 가독성은 은근 암호문 같아서 확실히 떨어지는 것 같긴 하다), 파이썬을 경험해 보고 비슷하지만 무척 현대적으로 깔끔하다는 느낌을 받았다. 또 파이썬은 프로그래밍 하는 사람의 스타일에 따라 perl 같은 라이트하게 만들어 유틸성으로 사용하는 스크립트형 코딩도 가능하고, java 나 c# 같은 구조적인 언어가 가진 객체 지향이나, 웹의 mvc 같은 구조의 방식을 취할 수도 있어 스타일을 선택해 사용이 가능하도록 스펙트럼을 넓혀 놓은 것 같다. 기회가 닿는 다면 파이썬과 비슷한 느낌이지만 고전성과 정규식의 미가 있는 펄(perl) 이라는 언어도 한번 사용해 보길 추천한다.

 

 

  그럼 잡담은 그만하고(야매지만 할말은 많다 - -;) mssql 을 설치하고 python 으로 필요한 모듈을 설치하고, 샘플 코드를 만들어 보도록 해보자. 참고로 순서는 아래와 같으니 무엇을 하려고 진행하는 건지 의식적으로 생각하면서 따라해 보자

  1) MSSQL 설치

  2) 서비스 설정

  3) 실습용 DB 및 사용자 설정

  4) 테이블 생성과 데이터 입력

  5) python 으로 조회해 보기

 

 

 

 

1) MSSQL 설치

 

  먼저 구글에서 다음과 같이 다운로드 가능한 링크를 찾는다 'mssql 2016 express download' 두 번째로 나오는 아래의 링크에서 SQL Server 2016 express SP1 을 다운로드 한다.

  https://www.microsoft.com/ko-kr/sql-server/sql-server-editions-express

 

 

  설치 파일을 클릭해 설치를 클릭하고, 아래와 같은 화면에서 기본 설정을 선택 한다. 라이선스를 수락하고(요건 간단해서 스크린샷 생략), 기본 설치 위치로 설치한다(스크린샷 생략). 400 메가 정도의 다운로드가 시작되며 설치가 된다(설치가 예전에 비해 간략해진 듯 하다)

 

 

  그럼 아래와 같이 설치가 완료되었다는 화면이 나온다. 그냥 닫지 말고 아래의 SSMS 설치 버튼을 클릭한다(SSMS 는 SQL Server Management Studio의 약자로 SQL 서버 접속용 클라이언트 이다 - 오라클로 따지면 Oracle Developer 나 오렌지, 토드 같은 툴이다. 앞으로 우리는 SSMS 에서 테이블 등을 만들거나 조회해 준비와 검증을 해보고, 이후 파이썬으로 개발을 할 예정이다).

 

 

  아래 페이지로 이동되면, SQL Server Management Studio 16.5.1 을 다운받아 설치 한다. (900 메가 정도 된다. 배보다 배꼽이 더 크다더니...)

  https://msdn.microsoft.com/ko-kr/library/mt238290.aspx

 

 

  다운 받은 파일을 실행하고 아래와 같이 설치를 시작한다.

  자 이렇게 되면 MSSQL 설치는 무사히 완료됬다.

 

 

 

 

2) 서비스 설정

 

  그럼 서비스 설정을 해보자. 원래 개인적으로 이런저런게 막혀서(특히 원격에서 연결이 안되서 좀 헤멨다) 구글을 찾아 해결 했지만, 해당 부분은 파이썬 공부와 좀 거리가 멀기 때문에 선택과 집중을 위해 헤멧던 검색 과정은 생략하도록 하겠다. 설치된 프로그램에서 SQL Server Management studio 를 실행 하자.

 

 

  SSMS 가 뜨면서 "서버에 연결" 하기 창이 나오면, 서버 이름이 비어 있기 때문에(예전엔 디폴트로 표시됬는데...), 드랍박스를 열어서 "더 찾아보기"를 선택한다. 이후에 서버 찾아보기의 로컬 서버 탭에서 내가 설치한 데이터 베이스를 선택 한다.    

 

 

  이제 서버 이름이 나오고 인증을 Windows 인증 상태에서"연결" 버튼을 눌러 연결한다. (SQL Server는 인증 방식이 두 가지가 있는데, 1번째로는 SQL 설치된 서버에서는 Windows 인증으로 id/pass 없이 관리자 계정으로 들어갈 수 있고, 2번째로는 사용자를 생성하거나 SA(System Administrator) 계정을 활성화 시켜서 id/pass 를 넣어서 들어갈 수 있다)

 

 

  그럼 아래와 같이 개체 탐색기 창이 나타난다. MSSQL 을 처음 설치하면 Windows 인증으로만 로그인이 가능하다(아직 활성화되거나 만들어진 사용자가 없기 때문에). 그런데 우리가 만들 파이썬 프로그램은 id/pass 를 넣어서 SQL Server에서 연결해 사용할 것이므로, 해당 id/pass로 로그인 가능한 옵션을 켜줘야 한다. SQL 서버 이름을 선택하고 마우스 오른쪽 버튼을 눌러서 컨택스트 메뉴를 띄운 후 맨 아래 보이는 "속성" 메뉴를 클릭한다.

 

 

  그럼 "서버 속성" 창이 뜬다. 왼쪽 트리에서 보안 항목을 선택하면 서버 인증 옵션이 보이는데, 디폴트는 아래와 같이 Windows 인증 모드가 체크되어 있는데, "SQL Server 및 Windows 인증모드"를 선택 후 "확인" 버튼을 눌러 적용한다. 그럼 SQL 서버를 다시 시작해야 된다는 Alert 이 뜨며 적용이 된다.

 

 

  SQL 서버 재시작은 cmd 명령어로 하거나, 컴퓨터를 재부팅 해도 되긴 하겠지만 시작 > 모든 프로그램에서 Microsoft SQL Server 2016 > 구성도구 > "SQL Server 2016 구성 관리자" 를 실행 한다. 

 

 

 그럼 아래와 같은 "SQL Server Configuration Manager" 창이 뜨는데, 일단 서비스 재시작을 하기 전에 할 일이 하나 추가되었다. 현재 세팅 상태로만 운영하게 되면 SSMS 에서는 id/pass 로 잘 접속이 되는데, python 이나 telnet 으로는 접속이 안되는 일이 발생했다. 구글을 찾아보니 아래와 같은 안내가 있어 추가 적인 세팅을 한 후 서비스 재시작을 하려 한다. 

http://stackoverflow.com/questions/12774827/cant-connect-to-localhost-on-sql-server-express-2012-2016

 

 

  먼저 TCP/IP 를 enable 시킨다. 왼쪽에서 "SQL Server 네트워크 구성" > "SQLEXPRESS에 대한 프로토콜" 을 선택하고, 오른쪽에서 TCP/IP 항목을 더블 클릭 한다. "프로토콜" 탭에서 Enabled 를 "예"로 바꾸어 준다.

 

 

  그리고 동일한 화면의 IP 주소 탭으로 이동해서 맨아래의 "IPALL" 파트에서 "TCP Dynamic Ports" 항목을 지우고, "TCP Port" 항목에 MSSQL 디폴트 port 인 "1433" 을 넣은 후 확인 버튼을 누른다. 그럼 앞서와 마찬가지로 서비스를 재시작 해야된다는 메시지가 나온다.   

 

 

  서비스 재시작을 위해서, 다시 왼쪽에서 "SQL Server 서비스"를 선택하고, 오른 쪽에서 "SQL Server (SQLEXPRESS)" 항목을 클릭 후 마우스 오른 쪽 버튼으로 컨텍스트 메뉴를 띄워서, "다시 시작" 클릭 해, 서비스를 종료했다 다시 시작한다.

 

  자 이렇게 하면 원격 서비스 설정이 완료이다. 이제 부터는 MSSQL 을 사용하기 위해 세팅하는 부분을 진행한다.

 

※ 파이썬을 돌리기 전에 간단히 서버 연결을 확인 하려면, telnet 서비스를 설치하고 cmd 창에서 'telnet localhost 1433' 으로 정상적으로 연결되는지 보면 된다. 텔넷은 아래 링크에서...

  https://opentutorials.org/module/2160/12506

 

 

 

 

3) 실습용 DB 및 사용자 설정

 

  개체 탐색기에서 "데이터베이스" 항목을 선택 후 컨택스트 메뉴를 띄워(이제 마우스 오른쪽 버튼 누르라는 얘기는 생략한다--;), "새 데이터베이스" 항목을 선택한다.

 

 

  데이터베이스 이름을 "mytest" 라고 입력하고(여러분이 좋아하는 다른 이름을 입력해도 되지만, 그러면 앞으로 제공할 소스에서 디비 이름 항목을 여러분 걸로 수정해 주어야 한다). 확인을 누른다.

 

 

 

 그럼 아래와 같이 별로 한것도 없는데, mytest 란 방금 만든 DB가 보이게 된다.

 

 

 

  자 이제 파이썬 프로그램에서 사용할 사용자를 만들어 보자. "보안" > "로그인" 항목을 선택하고, 컨텍스트 메뉴를 띄워 "새 로그인" 항목을 실행한다.

 

 

  "로그인 - 신규" 창이 뜨면, 왼쪽에서 "일반"을 선택 하고, 로그인 이름 "pyuser"(이것도 역시 원하면 취향대로 이름 만드시고, 나중 소스에서 수정!), "SQL Server 인증" 라디오 버튼을 클릭하고, 암호에 "test1234", 암호 확인에 "test1234" 를 넣는다. 공부하는 건데 암호가 만료되면 귀찮으므로(실제 운영시는 정책을 설정해 패스워드를 주기적으로 바꿔 주는게 보안 적으로 맞다) 아래와 같이 "암호 정책 강제 적용" 체크 박스를 끈다.

 

 

  이후 왼쪽에서 "서버역활" 항목을 클릭하고 sysadmin 을 클릭한다.(요 부분도 사실 admin 권한이므로 실제 웹어플리케이션 등 운영시는 권한을 제한하여 사용해야 한다).

 

 

  마지막으로 "사용자 매핑"을 선택하고, 오른쪽에서 "master" 데이터베이스를 선택하여 하단에서 "db_owner" 권한을 체크하고(이것도 "디비의 주인" 역활이기 때문에 운영에서는 과도한 권한임, master 데이터 베이스는 시스템의 여러 설정 값이나, 디비 스키마(디비구조 설계도) 등이 들어 있는데, 나중에 테이블 컬럼명을 얻어오는 코드에서 사용할 예정이다), 또 우리가 만든 "mytest" 데이터베이스를 선택하여 동일하게 "db_owner" 권한을 체크한다.  그리고 하단의 "확인" 버튼을 눌러 사용자 생성을 완료한다. 이렇게 되면 master db와 , mytest db 에 db_owner 권한을 가진, sysadmin 역할을 지닌 pyuser 사용자가 생성된다

 

 

  이후 SSMS 상단의 "파일" > "개체 탐색기 연결" 메뉴를 띄워 인증 부분을 "SQL Server 인증" 으로 바꾸고 우리가 생성한 id/pass 를 입력한다. 이후 "연결" 버튼을 누른다. 

 

 

  이제 개체 탐색기를 보면 2개의 똑같은 연결 항목이 있을 것이다. 항목 제목을 보면 위쪽은 첨에 우리가 Windows 인증으로 연결한 항목이고, 아래쪽은 지금 pyuser 로 연결한 항목이다.

 

 

  자 그러면 초보자들은 헷깔릴수 있으니, 위의 항목을 선택 후 컨택스트 메뉴를 띄워 "연결 끊기" 를 클릭한다.

 

 

  연결이 끊긴 후 개체 탐색기 메뉴를 보면 우리가 2번째 만든 pyuser 에 대한 항목만 하나 남게 된다. 이제 "mytest" DB 항목을 선택 하고, 컨텍스트 메뉴에서 "새 쿼리" 를 선택 한다.

 

 

  그럼 오른 쪽에 쿼리 창이 열리면서 커서가 빤짝빤짝 거린다. 쿼리창 상단에 마우스를 오버해 올려보면, mytest (pyuser (56)) 이라고 현재 사용하는 DB와 사용자 정보가 나온다.

 

 

  마지막으로 쿼리창에 "select SYSTEM_USER" 라고 입력후, 마우스로 드래그해 선택한다. 그리고 F5키 를 누른다(이것은 SSMS 상단 메뉴에서 "쿼리 > 실행" 을 누르는 것과 동일하다). 해당 명령은 등록된 사용자를 보여주는 명령어로 하단 결과 창에 우리가 등록한 "pyuser"가 보인다. (참고로 마우스로 드래그하여 선택하지 않으면 F5를 눌렀을때, 쿼리 창에 있는 모든 쿼리가 다 실행된다.)

 

  이제 MSSQL 을 파이썬에서 이용하기 위한 모든 준비가 끝났다(개인 적으로 관련 스크린샷 만드는 게 은근 힘들었어서, 큰 산을 넘은 듯하다 --;)

 

 

 

 

4) 테이블 생성과 데이터 입력

 

  이제 그러면 DB 에 테이블을 하나 만들어 보자. 구글에서 "mssql table create sample" 라고 검색해 보자. MSDN 설명은 보통 모든 옵션을 다 나열해서 장황하니 아래와 같이 좀 간략한 샘플을 제공하는 페이지를 참고한다.

  https://www.techonthenet.com/sql_server/tables/create_table.php

 

 

  간략히 설명하면 아래와 같다.

1
2
3
4
create table 소유자.테이블이름 (
   "컬럼이름1" " 담을 데이터형태" "각종제약조건(null 여부, primary, default, check 등)"
   "컬럼이름2" .... 
)
cs

 

 

  소유자를 안넣게 되면 현재 사용자의 테이블이 생성되기 때문에 현재 환경에서는 pyuser 가 dbowner 권한 이기 때문에, dbo(db owner)가 무조건 붙게 된다. 담을 데이터 형태는 파이썬과 마찬가지로 int, char, float 등등으로 컬럼에 담을 데이터의 형을 지정하게 된다. 제약 조건은 null, not null, primary, constraint, identity, foreign key, default value 등 여러가지 항목들이 있으나 해당 부분은 MSSQL 뿐만 아니라 표준 SQL 전반에 대한 공통된 내용이므로 "헤드퍼스트 SQL" 이나 잘 정리되 있는 블로그들을 참조한다(차후 개발 보안 관련 글들을 올릴때 SQL 의 전반적인 내용에 대해서 간단히 다룰 예정이긴 하다). 여기서는 null, not null 만 보자. null 은 해당 컬럼에 값을 넣지 않아도 관계없다는 거고, not null 은 꼭 어떤 값이 들어가야 한다는 얘기다.

 

  예를 들어 test 테이블에 no, name, card 라는 컬럼이 있고, card 라는 항목이 nullable 이라면 "1", "홍길동" 이런 식으로 3번째 card 값을 생략하고 한 행을 만들 수 있다(카드가 없는 사람도 있을 수 있기 때문에, 해당 card 라는 컬럼에 데이터가 비어 있는걸 가능하게 하는 것이다). 또 null 이라는 개념은 join 등에서도 해당 되는 대상이 없는 부분을 판단할때 같은 때도 사용하지만, 테이블 만의 개념을 설명하면 위와 같이 단순히 이해하면 된다. 또 데이터형 뒤에 null, not null 을 안 써준 경우 mssql은 기본적으로 null 형태라고 판단하긴 하는데, null 을 명시적으로 쓰는게 명확한 것 같긴하다. null 에 대한 고찰은 구글에서 'null 개념' 이라고 검색하여 아래와 같은 글들을 참고해 본다.

  http://slowalk.tistory.com/2181

 

 

  그럼 위의 지식을 기반으로 우리 실습에 사용할 supermarket 이란 테이블을 만들어 본다.

1
2
3
4
5
6
7
CREATE TABLE [dbo].[supermarket](
    [Itemno] [int] NULL,
    [Category] [char](20) NULL,
    [FoodName] [char](30) NULL,
    [Company] [char](20) NULL,
    [Price] [int] NULL
)
cs

 

 

  자 테이블의 내용을 보면 주인은 DBO(DB Owner = pyuser)이고, 컬럼은 아이템번호(itemno), 종류(category), 과자이름(foodname), 제조사(company), price(가격이다), 모두 비어 있을 수 있는 null 을 지정했고, 아이템번호와, 가격은 int 로 지정했다. 나머지 값들은 20, 30개의 문자로 이루어진 문자열 이다(mssql 은 대소문자 안가린다). 그럼 위의 소스를 긁어서 아까 실행해 놓은 쿼리 창에 붙여 넣고 내용 전체를 선택 후 F5키를 누른다. 하단 결과 창에 명령이 완료되었다고 뜨며, 왼쪽에 우리가 만든 supermarket 테이블이 보이게 된다

 

 

  이후 우리가 만든 테이블을 한번 내용을 조회해 보자. 아래의 소스에서 첫번째 줄인 "select ~ (nolock)" 부분을 복사해서 쿼리 창에 붙여 넣는다. '--' 로 시작되는 줄들은 주석 표시로, 쿼리가 처음 인 분을 위한 설명을 위해 넣었다

1
2
3
select * from supermarket(nolock)
-- 슈퍼마켓 테이블(supermarket) 로부터(from) 모든걸(*) 가져와봐(select) 
-- 다른거랑 부딛치지 말구(nolock)
cs
 

 

  근데 아래와 같이 컬럼 이름만 표시되고 빈 내용만 있다.

 

 

  우리가 아직 테이블만 만들고 데이터는 넣지 않았으니 당연하다. 그럼 데이터를 넣는 방법을 찾아보기 위해서 구글에서 "mssql insert sample"로 검색한다. 아까와 똑같은 techonthenet 사이트의 내용을 참고한다.

  https://www.techonthenet.com/sql_server/insert.php

1
2
3
4
INSERT INTO 테이블
(컬럼1, 컬럼2, 컬럼3)
VALUES
(넣을값1, 넣을값2, 넣을값3);
cs

 

 

  해당 방식을 이용해서 supermarket 에 넣을 쿼리를 만들면 아래와 같다. 역시 아래 소스를 긁어서 쿼리 분석기에 넣고 선택 후 F5키를 누른다(이제 요 긁어서~F5 설명도 익숙해 지셨을 테니 슬슬 생략 하고 "쿼리를 실행한다" 라고 표현한다.) 아래와 같은 4개 메시지가 결과 창에 나오면 성공한 것이다(4개의 데이터 건이 각각 들어갔으므로, 4개 행이 영향을 받았다고 나온다)
  (1개 행이 영향을 받음)
  (1개 행이 영향을 받음)
  (1개 행이 영향을 받음)
  (1개 행이 영향을 받음)
 

1
2
3
4
5
6
7
8
9
10
11
12
insert into supermarket
values (1,'과자', '초코파이', '오리온', 3000)
-- 슈퍼마켓 테이블(supermarket)안에(into) 값들(1,'과자', '초코파이', '오리온')을 넣어줘(insert)
 
insert into supermarket
values (2, '음료수', '크라운 커피', '크라운', 1000)
 
insert into supermarket
values (3, '음료수', '오리온 식혜', '오리온', 1300)
 
insert into supermarket
values (4, '과자', '크라운 산도', '크라운', 500)
cs

 

 

  그럼 아래 쿼리를 다시 실행해 본다.

1
select * from supermarket(nolock)
cs

 

 

  이제 화면과 같이 결과가 잘 나오게 된다. 

 

 

  참고로 아래와 같은 쿼리들도 추가로 돌려서 sql select 문의 여러가지 면들을 느껴보자.

1
2
3
4
5
6
7
8
9
10
11
-- 과자만 보고 싶어(category = '과자')
select * from supermarket(nolock) where category = '과자'
 
-- 1000원 이하(price <= 1000) 상품만 보고 싶어
select * from supermarket(nolock) where price <= 1000
 
-- 결과 중에 상품이름과, 회사만 보고 싶어
select FoodName, Company from supermarket(nolock) 
 
-- 과자이름 가나다 순으로 보고 싶어
select * from supermarket(nolock) order by FoodName
cs

 

  그럼 테이블 생성 및 샘플 데이터 입력 파트가 끝나게 되었다

 

 

 

 

5) python 으로 조회해 보기

 

  여기까지 오기전까지 MSSQL 설치 및, 세팅, 테이블 생성과 데이터 입력 후 조회를 해봤다. 무척 번거롭고 긴 과정이라고 느꼈을 수도 있겠지만, 앞 시간에서 얘기했듯이 4교시 앞 부분의 모든 과정은 python 하고 직접적인 관계가 없다. 어찌보면 일반적인 프로그래밍 요소에 대한 설명을 한 서비스 챕터 개념이다. 반대로 얘기하면 여기서 얻은 mssql(그리고 겪어봄 알겠지만 많이 비슷한 SQL 표준을 따르는 oracle, mysql 같은 관계형 DB 들, 하둡베이스의 hive 등)에 대한 지식들은 다른 언어를 할때도 역시 적절히 응용해 사용할 수 있다. 아마 나중에 lua, java 같은 다른 언어를 할 때도, 지금 알게된 이 지식 때문에, SQL을 호출하는 부분이 좀 더 수월하게 느껴지게 될 것이다. 프로그래밍은 코딩 작업이 아니다. 자기가 아는 구체적인 지식들을 코드라는 수단을 이용해 표현하는 것일 뿐이다. 구현할 주제와 관련된 모든 것을 잘 파악하고 있다면 구현은 비교적 간단해 진다. 그래서 같은 회사안에서도 바쁜척 하면서 설렁설렁 살아가는 프로그래머들도 있다. 요즘 많이 얘기되는 폴리글랏 프로그래밍도 어떤 측면에서는 같은 맥락인 듯 싶다. 새로운 언어를 빨리 배우는 능력은 언어와 연결된 배경을 잘 아는데서 기인할 수도 있다.

 

 

  우선 python 에서 mssql 을 호출하려면 어떻게 해야되는지 알기위해 구글을 검색해 보자. 구글에 "python 3 mssql" 로 검색한다. 맨위에 아래의 링크가 나오게 된다.

  http://www.c-sharpcorner.com/blogs/connect-ms-sql-server-2012-with-python-35

 

 

  내용을 참고해 보면 c# 언어에 대한 가이드긴 하지만 pymssql 이라는 모듈을 사용하고 아래의 명령으로 설치하라고 한다. cmd 창으로 가서 아래 명령어를 복사해 사용한다.

1
pip install pymssql  
cs

 

c:\>pip install pymssql
Collecting pymssql
  Using cached pymssql-2.1.3-cp35-cp35m-win_amd64.whl
Installing collected packages: pymssql
Successfully installed pymssql-2.1.3

 

  정상적으로 설치가 되었다고 문구가 나온다. 그럼 이제는 프로그램 소스에 이용할 관련 샘플을 찾아보자. "pymssql python sample" 이라고 찾으면 제일 위에 공식 홈에서 나온 설명 페이지가 나온다.

  http://pymssql.org/en/latest/pymssql_examples.html

 

 

  해당 페이지의 코드 중에, Basic Features 부분에서 테이블 생성과, 인서트 부분을 제외하고 셀렉트 코드 기준으로 적당히 편집해 가져오면 아래와 같다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
import pymssql
conn = pymssql.connect(server, user, password, "tempdb")
cursor = conn.cursor()
 
cursor.execute('SELECT * FROM persons WHERE salesrep=%s''John Doe')
row = cursor.fetchone()
while row:
    print("ID=%d, Name=%s" % (row[0], row[1]))
    row = cursor.fetchone()
 
conn.close()
 
 
cs

 

 

  샘플 코드의 동작을 확인 하기 위해 일단 다른 코드를 더 추가하지 말고, 해당 코드 그대로 현재 환경과 맟추어서 값을 조정해 넣어본다. where 조건은 없으므로, cursor.execute 의 뒷부분은(Jone Doe) 빼도 될듯 하다. 지금 만든 환경에 맞추면 아래와 같다. 맨위의 uft-8 이 부분은 한글 주석을 위해서 에러가 안 나도록 추가했다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding: utf-8 -*-
# 모듈 호출
import pymssql
# DB에 연결함
conn = pymssql.connect(server='localhost', user='pyuser', password='test1234', database='mytest')
# 커서를 만듬
cursor = conn.cursor()
# 커서에 쿼리를 얻어서 실행 시킴
cursor.execute('SELECT Itemno, Category, FoodName, Company, Price FROM supermarket(nolock);')
# 한 행을 가져옴
row = cursor.fetchone()
# 행이 존재할 때까지, 하나씩 행을 증가시키면서 1번째 컬럼을 숫자 2째번 컬럼을 문자로 출력함
while row:
    print("ID=%d, Name=%s" % (row[0], row[1]))
    row = cursor.fetchone()
#연결을 닫음
conn.close()
cs

 

    c:\python\code 디렉토리에 sql_sample.py 이름으로 저장후 실행 시키면 아래와 같은 결과가 나온다. (저장하고 실행하는 부분을 잘 모르겠으면 2교시 때 스크린샷과 함께 자세히 설명했었던 부분들을 다시 참고 한다)

c:\Python\code>python sql_sample.py
ID=1, Name=과자
ID=2, Name=음료수
ID=3, Name=음료수
ID=4, Name=과자

 

 

  그럼 c와 같이 % 로 타입을 지정해 출력하는게 조금 귀찮은 듯해서 소스에서 아래 print 부분만 조금 바꾸어 + 기호를 이용해 결합해 전체 컬럼을 스페이스로 구분된 문자열로 출력해 보자.

1
print (row[0+ " " + row[1+ " " + row[2+ " "  + row[3+ " " + row[4])
cs

 

  근데 실행을 해보니 아래와 같이 에러가 난다. 에러 내용을 보니 첫 번째 itemno 컬럼은 숫자인 int 이고 Category 컬럼은 문자열 이라서, 숫자와 문자열을 합치려고 한다고 에러가 난다.

c:\Python\code>python sql_sample.py
Traceback (most recent call last):
  File "sql_sample.py", line 14, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

 

 

  아래와 같이 결과 컬럼을 str() 함수로 명시적으로 문자열 타입으로 변경하게 하면 에러가 나지 않는다. (구글에서 'python int to string' 이렇게 입력해 방법을 찾았다)

1
2
3
4
5
6
7
8
9
10
11
12
13
import pymssql
 
conn = pymssql.connect(server='localhost', user='pyuser', password='test1234', database='mytest')
 
cursor = conn.cursor()
cursor.execute('SELECT Itemno, Category, FoodName, Company, Price FROM supermarket(nolock);')
 
row = cursor.fetchone()
while row:
    print (str(row[0]) + " " + str(row[1]) + " " + str(row[2]) + " "  + str(row[3]) + " " + str(row[4]))
    row = cursor.fetchone()
 
conn.close()
cs

 

  다시 실행을 해보면 아래와 같이 최종 결과가 정상적으로 나온다.

 

 

  그럼 위의 코드를 나중에 전체 프로그램을 만들때 다시 사용하기 위해 킾해두고 파이썬에서 DB 호출을 해보는 4교시 시간을 마치려 한다. 다음 시간에는 2번째 요소인 암호화 모듈을 사용해 대상을 암복호화 하는 샘플을 만들어 보려한다. 여러 SQL 종류에 대해서 간단히 얘기하기로 했었는데 너무 글이 길어진 듯해서 6교시 퍼즐 조각들을 합쳐보기에서 언급 하려한다. (별로 깊이는 없으니 많은 기대는 하지 마시고...)

 

 

 

 

2017.2.19 by 자유로운설탕
cs

 

 

 

posted by 자유로운설탕