Python DB-API 이전에는 데이터베이스 간의 애플리케이션 인터페이스가 매우 혼란스럽고 구현도 달랐습니다. 프로젝트에서 데이터베이스를 교체해야 하는 경우 많은 수정이 필요하므로 매우 불편합니다. Python DB-API의 등장은 이러한 문제를 해결하기 위한 것입니다. 이 글에서는 Python용 DB-API가 데이터베이스에 연결하기 위한 관련 정보를 주로 소개합니다.
서문
MySQL, SQL Server, PostgreSQL 또는 SQLite 등 Python으로 데이터베이스에 연결하려는 경우 누구나 알고 있습니다. , 사용 커서는 항상 사용되므로 Python DB-API를 배워야 합니다.
모든 Python 데이터베이스 인터페이스 프로그램은 Python DB-API 사양을 어느 정도 준수합니다. DB-API는 다양한 기본 데이터베이스 시스템 및 다양한 데이터베이스 인터페이스 프로그램에 대한 일관된 액세스 인터페이스를 제공하기 위해 일련의 필수 개체 및 데이터베이스 액세스 방법을 정의합니다. DB-API는 서로 다른 데이터베이스에 대해 일관된 액세스 인터페이스를 제공하므로 서로 다른 데이터베이스 간에 코드를 이식하는 것이 쉬운 작업이 됩니다.
Python 연결 데이터베이스 프로세스:
connect를 사용하여 생성됨 연결
연결 메소드는 데이터베이스에 액세스하는 데 사용되는 연결 개체를 생성합니다. 표준을 준수하는 모듈은 connect 메소드를 구현합니다.
연결 기능의 매개 변수는 다음과 같습니다.
user 사용자 이름
password 비밀번호
host 호스트 이름
database 데이터베이스 이름
dsn 데이터 소스 이름
데이터베이스 연결 매개변수는 DSN 문자열 형식으로 제공될 수 있습니다. 예: connect(dsn='host:MYDB',user='root',password=' ')
물론 서로 다른 데이터베이스 인터페이스 프로그램에는 약간의 차이가 있을 수 있으며 모든 것이 사양에 따라 엄격하게 구현되지는 않습니다. 예를 들어 MySQLdb는 사양에서 권장하는 데이터베이스 매개 변수 대신 db 매개 변수를 사용하여 데이터베이스를 나타냅니다. 액세스됨:
MySQLdb에 연결할 때 사용 가능한 매개변수
host: 기본값은 로컬 호스트입니다.
user: 데이터베이스 로그인 이름입니다. 기본값은 현재 사용자입니다.
passwd: 데이터베이스 로그인 비밀입니다.
db: 사용할 데이터베이스 이름 없음 기본값
port: MySQL 서비스에서 사용하는 TCP 포트입니다.
문자 집합: 데이터베이스 인코딩
psycopg2에 연결할 때 사용할 수 있는 매개변수:
dbname – 데이터베이스 이름(dsn 연결 모드)
database – 데이터베이스 이름
user – 사용자 이름
password - 비밀번호
host - 서버 주소(기본 연결 Unix Socket이 제공되지 않는 경우)
port - 연결 포트(기본값 5432)
연결 개체에는 다음과 같은 메서드가 있습니다.
close(): 이 연결 개체를 닫습니다. 닫은 후에는 연결이 다시 생성되지 않는 한 더 이상 작업을 수행할 수 없습니다.
commit(): 현재 트랜잭션을 제출합니다. 데이터베이스는 트랜잭션을 지원하며 추가, 삭제 또는 수정 후 커밋이 없으면 기본적으로 데이터베이스가 롤백됩니다.
rollback( ): 현재 트랜잭션 취소
cursor(): 커서 객체 생성
커서를 사용하여 커서 객체 생성
cursor 객체에는 다음과 같은 속성과 메서드가 있습니다.
일반적인 메서드:
close(): 이 커서 개체 닫기
fetchone(): 결과 집합의 다음 행을 가져옵니다
fetchmany([size =cursor.arraysize]) : 결과 집합의 다음 몇 행을 가져옵니다
fetchall(): 결과 집합의 나머지 모든 행을 가져옵니다
excute(sql [, args]): 하나의 데이터베이스 쿼리 또는 명령 실행
excutemany(sql, args): 여러 데이터베이스 쿼리 또는 명령 실행
공통 속성:
connection: 이 커서 개체에 대한 데이터베이스 연결 생성
arraysize: 레코드 수 fetchmany() 메서드를 사용하여 한 번에 가져옵니다. 기본값은 1
lastrowid: PHP의 last_inset_id()
다른 방법:
setoutputsizes(sizes[,col]): 대규모 열 가져오기를 위한 최대 버퍼 크기 설정
기타 속성:
설명: 커서 활동 상태를 반환합니다(7개 요소를 포함하는 튜플): (name, type_code, display_size, Internal_size, Precision, scale, null_ok) name 및 type_cose만 필수
rowcount: 마지막 실행()에 의해 생성되거나 영향을 받은 행 수
메시지: 실행 후 데이터베이스에서 반환된 정보 커서가 실행됨 튜플(선택 사항)
rownumber: 현재 결과 집합에서 커서가 위치한 행의 인덱스(시작 행 번호는 0)
DB-API에서만 오류 정의
오류 클래스의 계층 관계:
StandardError |__Warning |__Error |__InterfaceError |__DatabaseError |__DataError |__OperationalError |__IntegrityError |__InternalError |__ProgrammingError |__NotSupportedError
데이터베이스 운용 예시
코드는 다음과 같습니다.
#! /usr/bin/env python # -*- coding: utf-8 -*- # ************************************************************* # Filename @ operatemysql.py # Author @ Huoty # Create date @ 2015-08-16 10:44:34 # Description @ # ************************************************************* import MySQLdb # Script starts from here # 连接数据库 db_conn = MySQLdb.connect(host = 'localhost', user= 'root', passwd = '123456') # 如果已经创建了数据库,可以直接用如下方式连接数据库 #db_conn = MySQLdb.connect(host = "localhost", user = "root",passwd = "123456", db = "testdb") """ connect方法常用参数: host: 数据库主机名.默认是用本地主机 user: 数据库登陆名.默认是当前用户 passwd: 数据库登陆的秘密.默认为空 db: 要使用的数据库名.没有默认值 port: MySQL服务使用的TCP端口.默认是3306 charset: 数据库编码 """ # 获取操作游标 cursor = db_conn.cursor() # 使用 execute 方法执行SQL语句 cursor.execute("SELECT VERSION()") # 使用 fetchone 方法获取一条数据库。 dbversion = cursor.fetchone() print "Database version : %s " % dbversion # 创建数据库 cursor.execute("create database if not exists dbtest") # 选择要操作的数据库 db_conn.select_db('dbtest'); # 创建数据表SQL语句 sql = """CREATE TABLE if not exists employee( first_name CHAR(20) NOT NULL, last_name CHAR(20), age INT, sex CHAR(1), income FLOAT )""" try: cursor.execute(sql) except Exception, e: # Exception 是所有异常的基类,这里表示捕获所有的异常 print "Error to create table:", e # 插入数据 sql = """INSERT INTO employee(first_name, last_name, age, sex, income) VALUES ('%s', '%s', %d, '%s', %d)""" # Sex: Male男, Female女 employees = ( {"first_name": "Mac", "last_name": "Mohan", "age": 20, "sex": "M", "income": 2000}, {"first_name": "Wei", "last_name": "Zhu", "age": 24, "sex": "M", "income": 7500}, {"first_name": "Huoty", "last_name": "Kong", "age": 24, "sex": "M", "income": 8000}, {"first_name": "Esenich", "last_name": "Lu", "age": 22, "sex": "F", "income": 3500}, {"first_name": "Xmin", "last_name": "Yun", "age": 31, "sex": "F", "income": 9500}, {"first_name": "Yxia", "last_name": "Fun", "age": 23, "sex": "M", "income": 3500} ) try: # 清空表中数据 cursor.execute("delete from employee") # 执行 sql 插入语句 for employee in employees: cursor.execute(sql % (employee["first_name"], \ employee["last_name"], \ employee["age"], \ employee["sex"], \ employee["income"])) # 提交到数据库执行 db_conn.commit() # 对于支持事务的数据库, 在Python数据库编程中, # 当游标建立之时,就自动开始了一个隐形的数据库事务。 # 用 commit 方法能够提交事物 except Exception, e: # Rollback in case there is any error print "Error to insert data:", e #b_conn.rollback() print "Insert rowcount:", cursor.rowcount # rowcount 是一个只读属性,并返回执行execute(方法后影响的行数。) # 数据库查询操作: # fetchone() 得到结果集的下一行 # fetchmany([size=cursor.arraysize]) 得到结果集的下几行 # fetchall() 返回结果集中剩下的所有行 try: # 执行 SQL cursor.execute("select * from employee") # 获取一行记录 rs = cursor.fetchone() print rs # 获取余下记录中的 2 行记录 rs = cursor.fetchmany(2) print rs # 获取剩下的所有记录 ars = cursor.fetchall() for rs in ars: print rs # 可以用 fetchall 获得所有记录,然后再遍历 except Exception, e: print "Error to select:", e # 数据库更新操作 sql = "UPDATE employee SET age = age + 1 WHERE sex = '%c'" % ('M') try: # 执行SQL语句 cursor.execute(sql) # 提交到数据库执行 db_conn.commit() cursor.execute("select * from employee") ars = cursor.fetchall() print "After update: ------" for rs in ars: print rs except Exception, e: # 发生错误时回滚 print "Error to update:", e db.rollback() # 关闭数据库连接 db_conn.close()
데이터베이스 학습에 대한 Python 연결용 DB-API에 대한 자세한 설명 및 관련 기사는 PHP 중국어 사이트를 주목해주세요!