Python은 MySQL 데이터베이스를 운영합니다.
Python의 표준 데이터베이스 인터페이스는 개발자에게 데이터베이스 애플리케이션 프로그래밍 인터페이스를 제공하는 Python DB-API입니다.
Python 데이터베이스 인터페이스는 다양한 데이터베이스를 지원하므로 프로젝트에 적합한 데이터베이스를 선택할 수 있습니다.
GadFly
mSQL
MySQL
PostgreSQL
Microsoft SQL Server 2000
Informix
Interbase
Oracle
Sybase
Python 데이터베이스 인터페이스 및 API를 방문하여 지원되는 데이터베이스의 세부 목록을 볼 수 있습니다.
다른 데이터베이스에 대해 다른 DB API 모듈을 다운로드해야 합니다. 예를 들어 Oracle 데이터베이스와 Mysql 데이터에 액세스해야 하는 경우 Oracle 및 MySQL 데이터베이스 모듈을 다운로드해야 합니다.
DB-API는 다양한 기본 데이터베이스 시스템과 다양한 데이터베이스 인터페이스 프로그램에 일관된 액세스 인터페이스를 제공하기 위해 필요한 일련의 개체와 데이터베이스 액세스 방법을 정의합니다.
Python의 DB-API는 대부분의 데이터베이스에 대한 인터페이스를 구현합니다. 이를 사용하여 각 데이터베이스에 연결한 후 동일한 방식으로 각 데이터베이스를 작동할 수 있습니다.
Python DB-API 사용 프로세스:
API 모듈을 소개합니다.
데이터베이스에 연결합니다.
SQL 문과 저장 프로시저를 실행합니다.
데이터베이스 연결을 닫습니다.
MySQLdb란 무엇인가요?
MySQLdb는 Python 데이터베이스 API 사양 V2.0을 기반으로 하는 Python용 인터페이스입니다. MySQL C 기반 API 기반.
MySQLdb를 어떻게 설치하나요?
DB-API로 MySQL 스크립트를 작성하려면 MySQL이 설치되어 있는지 확인해야 합니다. 다음 코드를 복사하여 실행하세요.
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb
실행 후 출력이 다음과 같다면 MySQLdb 모듈을 설치하지 않은 것입니다.
Traceback (most recent call last): File "test.py", line 3, in <module> import MySQLdb ImportError: No module named MySQLdb
MySQLdb를 설치하려면 http:/를 방문하세요. /sourceforge.net/projects/mysql-python , (Linux 플랫폼에서 액세스 가능: https://pypi.python.org/pypi/MySQL-python) 여기에서 플랫폼에 적합한 설치 패키지를 선택할 수 있습니다. 미리 컴파일된 바이너리 파일과 소스 코드 설치 패키지로 변환됩니다.
바이너리 파일 배포 버전을 선택하면 기본 설치 프롬프트로 설치 프로세스를 완료할 수 있습니다. 소스 코드에서 설치하는 경우 MySQLdb 배포판의 최상위 디렉터리로 전환하고 다음 명령을 입력해야 합니다:
$ gunzip MySQL-python-1.2.2.tar.gz $ tar -xvf MySQL-python-1.2.2.tar $ cd MySQL-python-1.2.2 $ python setup.py build $ python setup.py install
참고: 설치하려면 루트 권한이 있는지 확인하세요. 위의 모듈.
데이터베이스 연결
데이터베이스에 연결하기 전에 다음 사항을 확인하세요.
TESTDB 데이터베이스를 생성했습니다.
TESTDB 데이터베이스에서 EMPLOYEE 테이블을 생성했습니다
EMPLOYEE 테이블의 필드는 FIRST_NAME, LAST_NAME, AGE, SEX 및 INCOME입니다.
데이터베이스 TESTDB에 연결하는 데 사용되는 사용자 이름은 "testuser"이고 비밀번호는 "test123"입니다. 직접 설정하거나 Mysql 데이터베이스의 루트 사용자 이름과 비밀번호를 직접 사용할 수 있습니다. 사용자 인증 Grant 명령을 사용하십시오.
Python MySQLdb 모듈이 컴퓨터에 설치되었습니다.
SQL 문에 익숙하지 않은 경우 기본 SQL 자습서를 참조하세요.
예:
다음 예는 다음 링크에 연결됩니다. Mysql의 TESTDB 데이터베이스:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # 使用execute方法执行SQL语句 cursor.execute("SELECT VERSION()") # 使用 fetchone() 方法获取一条数据库。 data = cursor.fetchone() print "Database version : %s " % data # 关闭数据库连接 db.close()
위 스크립트를 실행한 결과는 다음과 같습니다.
Database version : 5.0.45
데이터베이스 테이블 생성
데이터베이스 연결이 존재하는 경우 다음을 수행할 수 있습니다. 실행() 메소드를 사용하여 데이터베이스 테이블 Table을 생성하고 다음과 같이 EMPLOYEE 테이블을 생성합니다.
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # 如果数据表已经存在使用 execute() 方法删除表。 cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # 创建数据表SQL语句 sql = """CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )""" cursor.execute(sql) # 关闭数据库连接 db.close()
데이터베이스 삽입 작업
다음 예에서는 SQL INSERT 문을 사용하여 레코드를 삽입합니다. table EMPLOYEE:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 插入语句 sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try: # 执行sql语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # Rollback in case there is any error db.rollback() # 关闭数据库连接 db.close()
위 예 다음 형식으로 작성할 수도 있습니다.
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 插入语句 sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \ LAST_NAME, AGE, SEX, INCOME) \ VALUES ('%s', '%s', '%d', '%c', '%d' )" % \ ('Mac', 'Mohan', 20, 'M', 2000) try: # 执行sql语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # 发生错误时回滚 db.rollback() # 关闭数据库连接 db.close()
예:
다음 코드는 변수를 사용하여 SQL 문에 매개 변수를 전달합니다.
.................................. user_id = "test123" password = "password" con.execute('insert into Login values("%s", "%s")' % \ (user_id, password)) ..................................
데이터베이스 쿼리 작업
Python은 fetchone() 메서드를 사용하여 단일 데이터 조각을 가져오고 fetchall() 메서드를 사용하여 여러 데이터 조각을 가져옵니다.
fetchone(): 이 메소드는 다음 쿼리 결과 세트를 가져옵니다. 결과 집합은 객체입니다.
fetchall():반환된 모든 결과 행을 받습니다.
rowcount : 이는 읽기 전용 속성이며, Execute() 메서드를 실행한 후 영향을 받은 행 수를 반환합니다.
예:
EMPLOYEE 테이블에서 급여 필드가 1000보다 큰 모든 데이터를 쿼리합니다.
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 查询语句 sql = "SELECT * FROM EMPLOYEE \ WHERE INCOME > '%d'" % (1000) try: # 执行SQL语句 cursor.execute(sql) # 获取所有记录列表 results = cursor.fetchall() for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # 打印结果 print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \ (fname, lname, age, sex, income ) except: print "Error: unable to fecth data" # 关闭数据库连接 db.close()
위 스크립트 실행 결과는 다음과 같습니다. :
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
데이터베이스 업데이트 작업
업데이트 작업은 데이터 테이블의 데이터를 업데이트하는 데 사용됩니다. 다음 예에서는 TESTDB 테이블의 모든 SEX 필드를 'M'으로 변경합니다. , AGE 필드는 1씩 증가합니다.
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 更新语句 sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') try: # 执行SQL语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # 发生错误时回滚 db.rollback() # 关闭数据库连接 db.close()
삭제 작업
삭제 작업은 데이터 테이블의 데이터를 삭제하는 데 사용됩니다. 다음 예에서는 모든 데이터를 삭제하는 방법을 보여줍니다. EMPLOYEE 데이터 테이블의 AGE가 20보다 큰 경우:
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打开数据库连接 db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 删除语句 sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # 执行SQL语句 cursor.execute(sql) # 提交修改 db.commit() except: # 发生错误时回滚 db.rollback() # 关闭连接 db.close()
트랜잭션 실행
트랜잭션 메커니즘은 데이터 일관성을 보장할 수 있습니다.
트랜잭션에는 원자성, 일관성, 격리성, 내구성이라는 4가지 속성이 있어야 합니다. 이러한 네 가지 속성을 흔히 ACID 속성이라고 합니다.
원자성. 트랜잭션은 분할할 수 없는 작업 단위입니다. 트랜잭션에 포함된 모든 작업은 수행되거나 수행되지 않습니다.
일관성. 트랜잭션은 데이터베이스를 하나의 일관성 상태에서 다른 일관성 상태로 변경해야 합니다. 일관성과 원자성은 밀접한 관련이 있습니다.
격리. 트랜잭션의 실행은 다른 트랜잭션에 의해 방해받을 수 없습니다. 즉, 트랜잭션 내에서 사용되는 작업과 데이터는 다른 동시 트랜잭션과 격리되며, 동시에 실행되는 트랜잭션은 서로 간섭할 수 없습니다.
내구성. 영속성이라고도 하는 연속성은 트랜잭션이 커밋되면 데이터베이스의 데이터 변경 사항이 영구적이어야 함을 의미합니다. 후속 작업이나 실패는 이에 영향을 미치지 않습니다.
Python DB API 2.0 트랜잭션은 커밋 또는 롤백 두 가지 방법을 제공합니다.
예:
# SQL删除记录语句 sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # 执行SQL语句 cursor.execute(sql) # 向数据库提交 db.commit() except: # 发生错误时回滚 db.rollback()
트랜잭션을 지원하는 데이터베이스의 경우 Python 데이터베이스 프로그래밍에서는 커서가 생성되면 보이지 않는 데이터베이스 트랜잭션이 자동으로 시작됩니다.
commit() 메서드는 커서에 대한 모든 업데이트 작업을 수행하고, Rollback() 메서드는 현재 커서에 대한 모든 작업을 롤백합니다. 각 메소드는 새로운 트랜잭션을 시작합니다.
오류 처리
DB API는 데이터베이스 작업에 대한 일부 오류와 예외를 정의합니다. 다음 표에는 이러한 오류와 예외가 나열되어 있습니다.
异常 | 描述 |
---|---|
Warning | 当有严重警告时触发,例如插入数据是被截断等等。必须是 StandardError 的子类。 |
Error | 警告以外所有其他错误类。必须是 StandardError 的子类。 |
InterfaceError | 当有数据库接口模块本身的错误(而不是数据库的错误)发生时触发。 必须是Error的子类。 |
DatabaseError | 和数据库有关的错误发生时触发。 必须是Error的子类。 |
DataError | 当有数据处理时的错误发生时触发,例如:除零错误,数据超范围等等。 必须是DatabaseError的子类。 |
OperationalError | 指非用户控制的,而是操作数据库时发生的错误。例如:连接意外断开、 数据库名未找到、事务处理失败、内存分配错误等等操作数据库是发生的错误。 必须是DatabaseError的子类。 |
IntegrityError | 完整性相关的错误,例如外键检查失败等。必须是DatabaseError子类。 |
InternalError | 数据库的内部错误,例如游标(cursor)失效了、事务同步失败等等。 必须是DatabaseError子类。 |
ProgrammingError | 程序错误,例如数据表(table)没找到或已存在、SQL语句语法错误、 参数数量错误等等。必须是DatabaseError的子类。 |
NotSupportedError | 不支持错误,指使用了数据库不支持的函数或API等。例如在连接对象上 使用.rollback()函数,然而数据库并不支持事务或者事务已关闭。 必须是DatabaseError的子类。 |