Python-MySQL 데이터베이스 액세스

데이터베이스 인터페이스에 대한 Python 표준은 Python DB-API입니다. 대부분의 Python 데이터베이스 인터페이스는이 표준을 따릅니다.

애플리케이션에 적합한 데이터베이스를 선택할 수 있습니다. Python Database API는 다음과 같은 광범위한 데이터베이스 서버를 지원합니다.

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • 마이크로 소프트 SQL 서버 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase

여기에 사용할 수 파이썬 데이터베이스 인터페이스의 목록입니다 : 파이썬 데이터베이스 인터페이스 및 API . 액세스해야하는 각 데이터베이스에 대해 별도의 DB API 모듈을 다운로드해야합니다. 예를 들어 Oracle 데이터베이스와 MySQL 데이터베이스에 액세스해야하는 경우 Oracle 및 MySQL 데이터베이스 모듈을 모두 다운로드해야합니다.

DB API는 가능한 경우 Python 구조와 구문을 사용하는 데이터베이스 작업을위한 최소한의 표준을 제공합니다. 이 API에는 다음이 포함됩니다.

  • API 모듈 가져 오기.
  • 데이터베이스와의 연결 획득.
  • SQL 문 및 저장 프로 시저 실행.
  • 연결 닫기

우리는 MySQL을 사용하여 모든 개념을 배울 것이므로 MySQLdb 모듈에 대해 이야기하겠습니다.

MySQLdb 란 무엇입니까?

MySQLdb는 Python에서 MySQL 데이터베이스 서버에 연결하기위한 인터페이스입니다. Python Database API v2.0을 구현하고 MySQL C API를 기반으로 구축되었습니다.

MySQLdb는 어떻게 설치합니까?

계속하기 전에 컴퓨터에 MySQLdb가 설치되어 있는지 확인하십시오. Python 스크립트에 다음을 입력하고 실행하십시오.

#!/usr/bin/python

import MySQLdb

다음과 같은 결과가 나오면 MySQLdb 모듈이 설치되지 않은 것입니다.

Traceback (most recent call last):
   File "test.py", line 3, in <module>
      import MySQLdb
ImportError: No module named MySQLdb

MySQLdb 모듈을 설치하려면 다음 명령을 사용하십시오-

For Ubuntu, use the following command -
$ sudo apt-get install python-pip python-dev libmysqlclient-dev For Fedora, use the following command - $ sudo dnf install python python-devel mysql-devel redhat-rpm-config gcc
For Python command prompt, use the following command -
pip install MySQL-python

Note − 위 모듈을 설치하려면 루트 권한이 있는지 확인하십시오.

데이터베이스 연결

MySQL 데이터베이스에 연결하기 전에 다음 사항을 확인하십시오.

  • TESTDB 데이터베이스를 만들었습니다.

  • TESTDB에 EMPLOYEE 테이블을 작성했습니다.

  • 이 테이블에는 FIRST_NAME, LAST_NAME, AGE, SEX 및 INCOME 필드가 있습니다.

  • 사용자 ID "testuser"및 비밀번호 "test123"은 TESTDB에 액세스하도록 설정됩니다.

  • Python 모듈 MySQLdb가 컴퓨터에 올바르게 설치되었습니다.

  • MySQL 기본 사항 을 이해하기 위해 MySQL 자습서를 살펴 보았습니다.

다음은 MySQL 데이터베이스 "TESTDB"와 연결하는 예입니다.

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")

# Fetch a single row using fetchone() method.
data = cursor.fetchone()
print "Database version : %s " % data

# disconnect from server
db.close()

이 스크립트를 실행하는 동안 내 Linux 컴퓨터에서 다음 결과가 생성됩니다.

Database version : 5.0.45

데이터 소스와 연결이 설정되면 연결 개체가 반환되어 db 추가 사용을 위해, 그렇지 않으면 db없음으로 설정됩니다. 다음,db 개체는 cursor개체는 SQL 쿼리를 실행하는 데 사용됩니다. 마지막으로 나오기 전에 데이터베이스 연결이 닫히고 리소스가 해제되었는지 확인합니다.

데이터베이스 테이블 생성

데이터베이스 연결이 설정되면 다음을 사용하여 데이터베이스 테이블에 테이블 또는 레코드를 만들 준비가 된 것입니다. execute 생성 된 커서의 방법.

EMPLOYEE 데이터베이스 테이블을 만들자-

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

# Create table as per requirement
sql = """CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""

cursor.execute(sql)

# disconnect from server
db.close()

INSERT 작업

데이터베이스 테이블에 레코드를 만들 때 필요합니다.

다음 예는 SQL INSERT 문을 실행 하여 EMPLOYEE 테이블에 레코드를 생성합니다.

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

위의 예는 동적으로 SQL 쿼리를 생성하기 위해 다음과 같이 작성할 수 있습니다-

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
       LAST_NAME, AGE, SEX, INCOME) \
       VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
       ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

다음 코드 세그먼트는 매개 변수를 직접 전달할 수있는 또 다른 실행 형태입니다.

..................................
user_id = "test123"
password = "password"

con.execute('insert into Login values("%s", "%s")' % \
             (user_id, password))
..................................

읽기 작업

모든 데이터베이스에 대한 읽기 작업은 데이터베이스에서 유용한 정보를 가져 오는 것을 의미합니다.

데이터베이스 연결이 설정되면이 데이터베이스에 쿼리 할 준비가 된 것입니다. 둘 중 하나를 사용할 수 있습니다.fetchone() 단일 레코드를 가져 오는 방법 또는 fetchall() 데이터베이스 테이블에서 여러 값을 fetech하는 방법.

  • fetchone()− 질의 결과 집합의 다음 행을 가져옵니다. 결과 집합은 커서 개체를 사용하여 테이블을 쿼리 할 때 반환되는 개체입니다.

  • fetchall()− 결과 집합의 모든 행을 가져옵니다. 결과 집합에서 이미 일부 행이 추출 된 경우 결과 집합에서 나머지 행을 검색합니다.

  • rowcount − 이것은 읽기 전용 속성이며 execute () 메서드의 영향을받은 행 수를 반환합니다.

다음 절차는 급여가 1000 이상인 EMPLOYEE 테이블의 모든 레코드를 쿼리합니다.

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > '%d'" % (1000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Fetch all the rows in a list of lists.
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
      # Now print fetched result
      print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
             (fname, lname, age, sex, income )
except:
   print "Error: unable to fecth data"

# disconnect from server
db.close()

이것은 다음 결과를 생성합니다-

fname=Mac, lname=Mohan, age=20, sex=M, income=2000

업데이트 작업

모든 데이터베이스에 대한 UPDATE 작업은 데이터베이스에서 이미 사용 가능한 하나 이상의 레코드를 업데이트하는 것을 의미합니다.

다음 절차는 SEX가있는 모든 레코드를 업데이트합니다. 'M'. 여기에서는 모든 남성의 AGE를 1 년 늘립니다.

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
                          WHERE SEX = '%c'" % ('M')
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

작업 삭제

데이터베이스에서 일부 레코드를 삭제하려면 DELETE 작업이 필요합니다. 다음은 AGE가 20 이상인 EMPLOYEE의 모든 레코드를 삭제하는 절차입니다.

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

거래 수행

트랜잭션은 데이터 일관성을 보장하는 메커니즘입니다. 거래에는 다음과 같은 네 가지 속성이 있습니다.

  • Atomicity − 거래가 완료되거나 아무 일도 일어나지 않습니다.

  • Consistency − 트랜잭션은 일관된 상태에서 시작하고 시스템을 일관된 상태로 유지해야합니다.

  • Isolation − 거래의 중간 결과는 현재 거래 외부에서 볼 수 없습니다.

  • Durability − 일단 트랜잭션이 커밋되면 시스템 장애 후에도 효과가 지속됩니다.

Python DB API 2.0은 트랜잭션을 커밋 하거나 롤백 하는 두 가지 방법을 제공 합니다.

트랜잭션을 구현하는 방법을 이미 알고 있습니다. 다시 비슷한 예가 있습니다.

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

COMMIT 작업

커밋은 변경 사항을 완료하기 위해 데이터베이스에 녹색 신호를 제공하는 작업이며,이 작업 후에는 변경 사항을 되돌릴 수 없습니다.

다음은 호출하는 간단한 예입니다. commit 방법.

db.commit()

ROLLBACK 작업

하나 이상의 변경 사항에 만족하지 않고 해당 변경 사항을 완전히 되돌리려면 다음을 사용하십시오. rollback() 방법.

다음은 호출하는 간단한 예입니다. rollback() 방법.

db.rollback()

데이터베이스 연결 해제

데이터베이스 연결을 끊으려면 close () 메소드를 사용하십시오.

db.close()

close () 메서드를 사용하여 사용자가 데이터베이스에 대한 연결을 닫으면 처리되지 않은 모든 트랜잭션이 DB에 의해 롤백됩니다. 그러나 DB 하위 수준 구현 세부 정보에 의존하는 대신 응용 프로그램이 커밋 또는 롤백을 명시 적으로 호출하는 것이 좋습니다.

오류 처리

오류의 원인은 많습니다. 몇 가지 예는 실행 된 SQL 문의 구문 오류, 연결 실패 또는 이미 취소되었거나 완료된 명령문 핸들에 대한 fetch 메소드 호출입니다.

DB API는 각 데이터베이스 모듈에 존재해야하는 여러 오류를 정의합니다. 다음 표에는 이러한 예외가 나열되어 있습니다.

Sr. 아니. 예외 및 설명
1

Warning

치명적이지 않은 문제에 사용됩니다. StandardError를 하위 클래스로 분류해야합니다.

2

Error

오류의 기본 클래스입니다. StandardError를 하위 클래스로 분류해야합니다.

InterfaceError

데이터베이스 자체가 아닌 데이터베이스 모듈의 오류에 사용됩니다. Error를 하위 클래스로 분류해야합니다.

4

DatabaseError

데이터베이스 오류에 사용됩니다. Error를 하위 클래스로 분류해야합니다.

5

DataError

데이터의 오류를 참조하는 DatabaseError의 하위 클래스입니다.

6

OperationalError

데이터베이스에 대한 연결 끊김과 같은 오류를 참조하는 DatabaseError의 하위 클래스입니다. 이러한 오류는 일반적으로 Python 스크립터의 제어 범위를 벗어납니다.

7

IntegrityError

고유성 제약 조건 또는 외래 키와 같이 관계형 무결성을 손상시킬 수있는 상황에 대한 DatabaseError의 하위 클래스입니다.

8

InternalError

커서가 더 이상 활성화되지 않는 것과 같이 데이터베이스 모듈 내부의 오류를 참조하는 DatabaseError의 하위 클래스입니다.

9

ProgrammingError

잘못된 테이블 이름 및 안전하게 비난받을 수있는 기타 오류를 참조하는 DatabaseError의 하위 클래스입니다.

10

NotSupportedError

지원되지 않는 기능을 호출하려는 것을 나타내는 DatabaseError의 하위 클래스입니다.

Python 스크립트는 이러한 오류를 처리해야하지만 위의 예외를 사용하기 전에 MySQLdb가 해당 예외를 지원하는지 확인하세요. DB API 2.0 사양을 읽고 이에 대한 자세한 정보를 얻을 수 있습니다.