반응형

* 윈도우에서 python용 MySql(MariaDB) 드라이버 설치 방법

버전별 드라이버 다운로드 http://www.lfd.uci.edu/~gohlke/pythonlibs/

사이트에서 mysqlclient 로 검색하여 원하는 파일( mysqlclient-1..-cp3*-cp3*m-win_amd64.whl )을 다운로드하면 된다.

확장자를 zip으로 변경하고 압축을 풀어준다. 

풀린 파일과 폴더들을 복사한 후 C:\Python3*\Lib\site-packages 에 붙여넣기 하면 된다.

또는 pip install ... 해주면 된다.

이클립스에서 MariaDB를 연결하는 방법은 다음과 같습니다.

 

방법 1.

conn = MySQLdb.connect(host = '127.0.0.1', user = '사용자이름', password='비밀번호', database='DB명')

ex)
conn = MySQLdb.connect(host = '127.0.0.1', user = 'root', password='123', database='test')

또는 다음과 같이 작성해주시면됩니다.

 

config = {

    'host':'127.0.0.1',
    'user':'사용자이름',
    'password':'비밀번호',
    'database':'DB명',
    'port':3306,
    'charset':'utf8',
    'use_unicode':True
}

ex)

config = {

    'host':'127.0.0.1',
    'user':'root',
    'password':'123',
    'database':'test',
    'port':3306,
    'charset':'utf8',
    'use_unicode':True

}

 

이번에는 제가 만든 테이블에 데이터를 삽입하고 결과를 출력해보겠습니다.

 

table prac

CREATE TABLE prac(num INT(255) NOT NULL PRIMARY KEY,
NAME VARCHAR(20),
HOUR INT(11),
pay INT(11))
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

 

 

위 DB연결 코드 밑에 데이터 삽입 SQL문을 넣고 결과를 보겠습니다

 

try:
    conn = MySQLdb.connect(**config)
    print(conn) # DB가 잘 연결되었는지 확인
    cursor = conn.cursor() # SQL문 수행을 위한 커서 객체 생성
    
   
        
except Exception as e:
    print('err : ',  e) 
    
finally:
    cursor.close()
    conn.close()

# print(conn) 의 출력 결과
<_mysql.connection open to '127.0.0.1' at 0000025181F6F578>

try문 내의 코드는 다음과 같습니다.

 

- import MySQLdb 를 하여 MySQLdb 모듈을 불러옵니다.

 

- MySQLdb.connect(**config) 메소드를 통하여 MySQL에 연결해줍니다. 호스트명, 사용자명, 암호, 접속할 DB, 포트, 등을 기재합니다.

 

- DB 접속이 성공하면, Connection 객체로부터 cursor() 메서드를 호출하여 Cursor 객체를 가져옵니다.

 

- cursor 객체를 생성하였다면 이제 이 객체로 SQL의 DML 명령어들을 다 수행할 수 있습니다.

 

이제 자료를 추가하고 수정하고 삭제하는 DML 명령어들을 작성해보겠습니다. 

 

지금부터 작성되는 내용들은 try ~ except 안에 추가로 작성해주시면됩니다.

 

1. 자료 추가 ( insert ) , 자료 조회 ( select )

방법 1.

# 자료 추가
    sql = "insert into prac(num, NAME, HOUR, pay) values (1, '홍길동',3,8000)"
    cursor.execute(sql) # 결과가 1이면 commit한다 아니면 rollback execute에 사실 리턴값이 존재
    conn.commit()
    
#select 전체자료 읽기
    sql = 'select * from prac'
    cursor.execute(sql)
    
    # 출력1 튜플 타입으로 출력된다
    for data in cursor.fetchall():
        print(data)
        
        
# 출력결과

(1, '홍길동', 3, 8000)

 insert 문을 사용하여 각각의 컬럼에 맞게 값들을 입력해주었습니다.

 

이후 cursor객체에 execute를 사용해  실행할 sql문이 들어있는 변수를 입력해줍니다.

그 후 commit() 과정을 해주어야 합니다.

그 이유는 Autocommit 이 아니기때문입니다. 자동으로 commit 실행을 하고싶다면, connect() 메서드 호출시 autocommit=True 를 지정해줍니다.

 

insert문이 잘 실행되었는지 보기 위해 select 문도 작성하고, 반복문 for을 통해 데이터가 잘 삽입 되었는지 출력해보았습니다.

 

이번에는 다른 방법으로 insert 문과 select문을 사용해보겠습니다.

방법 2.

 sql = "insert into prac values(%s,%s,%s,%s)" # 자바는 values에 ?가 들어감
    sql_data = (2, 'insert2','5', 9000)
    cursor.execute(sql, sql_data)
    conn.commit()
    
    
    
     # 출력 2 
     # 반복문 for에 cursor 객체 값들을 r에 넣고 출력
     # list로 출력
    for r in cursor: 
    
     # 배열에 저장되는 값들은 다음과 같습니다.
        print([r[0], r[1], r[2], r[3]]) # r[0] = num값 r[1] name값 r[2] HOUr값 r[3] pay값 저장     
        
# 출력 결과

[1, '홍길동', 3, 8000]
[2, 'insert2', 5, 9000]


 

방법 3.

 

    sql = "insert into prac values(%s,%s,%s,%s)" # 자바는 values에 ?가 들어감
    sql_data = '3','insert3',5,6000
    cursor.execute(sql, sql_data)
    conn.commit()

# 출력 3
# 이번에는 매핑을 이용하여 서로 값이 일치하게 저장되도록 합니다.
    for (num, NAME, HOUR, pay) in cursor:
        print(num, NAME, HOUR, pay)
       	print()

# 출력4
    for (a, b, c, d) in cursor: # 매핑한거라 값은 같게 출력
        print(a, b, c, d)

# 출력 결과

1 홍길동 3 8000
2 insert2 5 9000
3 insert3 5 6000

1 홍길동 3 8000
2 insert2 5 9000
3 insert3 5 6000

 

update / delete 문 사용 후 출력 방식은 출력 1에서 사용한 방법으로 출력하도록 하겠습니다.

 

2. UPDATE

# 자료 수정

    sql = "update prac set NAME = %s, HOUR=%s, pay=%s where num=%s"
    sql_data = ('홍씨에서이씨', 5, 10000, 1)
    cursor.execute(sql, sql_data)
    conn.commit()


    #select 전체자료 읽기
    sql = 'select * from prac'
    cursor.execute(sql)
    
    # 출력1

    for data in cursor.fetchall():
        print(data)
        
        
# 출력 결과

(1, '홍씨에서이씨', 5, 10000)
(2, 'insert2', 5, 9000)
(3, 'insert3', 5, 6000)

 

3. DELETE

 

방법 1)

 

    # 자료 삭제 
    num = '1'
    sql = "delete from prac where num = " + num #권장x
    cursor.execute(sql)
    conn.commit()


	# 출력 결과
    
    (2, 'insert2', 5, 9000)
	(3, 'insert3', 5, 6000)

 

방법 2)

 

    num = '2'

    sql = "delete from prac where num='{0}'".format(num) 
    cursor.execute(sql)
    conn.commit()
    
    
    # 출력 결과
    
    (3, 'insert3', 5, 6000)

 

방법 3)

 

    num = '3'

    sql = "delete from prac where num=%s" #가장많이 쓰는 방법 밑에 cursor와 매핑 할땐 튜플형태로 줘라
    cursor.execute(sql, (num, ))
    conn.commit()
    
    
    # 출력 결과
    
    

 

참고사이트

 

https://cafe.daum.net/flowlife

 

반응형

'python' 카테고리의 다른 글

[python] Numpy 데이터타입, 메모리저장, 배열  (0) 2020.05.28
python - Thread ( 스레드 ) (1)  (0) 2020.05.14
python - 예외처리  (0) 2020.05.11
python - OS & pickle  (0) 2020.05.11
python - 상속 (2)  (0) 2020.05.10
반응형

재귀함수란 ?

 

- 함수 안에서 자신을 다시 호출하는 방법입니다.

- 함수 내에서 자신을 다시 호출한 후 함수가 끝나는 이후에는 종료 조건을 붙여주어야 무한루프에 빠지지 않습니다.

 

 

def CountDown(n):
    if n == 0:
        print('완료')
        
    else:
        print(n, end=' ')
        CountDown(n - 1)
 
CountDown(5)


출력 결과

5 4 3 2 1 완료

 

CountDown 함수에 5가 들어간후 if문을 실행합니다. n == 5이기 때문에 else 문을 실행하고,

그 다음 n - 1 을 통해 n는 4가 되고 다시 if문을 거쳐 else 문을 실행하게 됩니다.

이 과정을 반복하다가 n이 0이 될 경우 완료를 출력하고 빠져나오게 됩니다.

 

예제 2)

def fact(a):
    if a== 1: return 1
    print(a)
    return a * fact(a-1)

result2 = fact(5)
print('5! : ' + str(result2))


출력 결과
5! : 120

 

예제 3)

def tot(n):
    if n == 1:
        print('탈출')
        return 1
    return n + tot(n-1)
result = tot(10)
print('합은' + str(result))


출력 결과

탈출
합은 55

 

위 예제는 if문을 주었지만 이번 예제는 루프 과정을 반복하다가 n이 1을 만나면 탈출하는 예제입니다.

 

이번 예제는 위와 동일한 원리입니다.

반응형

'python' 카테고리의 다른 글

python - 상속  (0) 2020.05.10
python - 클래스  (0) 2020.05.10
python - 함수 장식자 ( Decorator )  (0) 2020.05.10
python - 파이썬은 1급 함수인가 ?  (0) 2020.05.08
python - 가변인수  (0) 2020.05.08
반응형

Decorator 란?

 

함수 A를 다른 명령을 받아 또 다른 함수 B로 호출 하는 것이다.

 

바로 예를 들어보겠습니다.

 

# 함수 장식자(decorator
def make2(fn):
    return lambda:'파이썬 ' + fn() # '파이썬'과 fn() 함수를 합쳐서 리턴

def make1(fn):
    return lambda:'공부를 '+fn()

def hello():
    return '열심히'

hi = make2(make1(hello))
print(hi())

# 출력 결과

파이썬 공부를 열심히

 

기존 hello() 함수는 '열심히' 만을 반환하는 함수입니다.

하지만 이 함수를 mak1이라는 함수에 씌워주고, 그 겉에는 또 다시 make2라는 함수로 덮어주었습니다.

 

그 말은 make2함수의 '파이썬'을 출력하고 그 안에 호출할 함수 make1 에서 '공부를' 호출 후 hello의 '열심히' 를 호출하게 됩니다.

 

위와 같은 방법이 아닌 다른 방법으로는 '@' 키워드를 사용하여도 적용 가능합니다.

 

함수를 데코레이션('@')으로 사용할 경우

def make6(fn):
    return lambda:'공부를 '+fn()

@make6
def hello1():
    return '열심히'

print((hello1()))


# 출력 결과

공부를 열심히

 

클래스를 데코레이션('@') 으로 사용할 경우

class prac(object):
    def __init__(self, fn):
        self.fn = fn

    def __call__(self, *args, **kwargs):
        result = self.fn(*args, **kwargs)
        print(f'Result: {result}')
        return result

@prac
def add(a, b):
    return a + b

add(5,1)

# 출력 결과


Result: 6
반응형

'python' 카테고리의 다른 글

python - 클래스  (0) 2020.05.10
python - 재귀함수  (0) 2020.05.10
python - 파이썬은 1급 함수인가 ?  (0) 2020.05.08
python - 가변인수  (0) 2020.05.08
python - range  (0) 2020.05.08

+ Recent posts