>  기사  >  백엔드 개발  >  데이터베이스 학습에 Python 연결을 위한 DB-API에 대한 자세한 설명

데이터베이스 학습에 Python 연결을 위한 DB-API에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-02-13 16:21:511929검색

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 연결 데이터베이스 프로세스:

데이터베이스 학습에 Python 연결을 위한 DB-API에 대한 자세한 설명

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()

다른 방법:

  • __iter__(): 반복 가능한 객체 만들기(선택 사항)

  • 다음( ): 결과 집합의 다음 행 가져오기(반복이 지원되는 경우)

  • nextset(): 다음 결과 집합으로 이동(지원되는 경우)

  • callproc(func[,args]): 저장 프로시저 호출

  • setinputsizes(sizes): 최대 입력 값 설정(필수이지만 특정 구현은 선택 사항임) )

  • 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 중국어 사이트를 주목해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.