Explication détaillée de la connexion DB-API pour Python à l'apprentissage de la base de données

高洛峰
Libérer: 2017-02-13 16:21:51
original
1924 Les gens l'ont consulté

Avant l'API DB-Python, les interfaces d'application entre les bases de données étaient très déroutantes et les implémentations étaient différentes. Si le projet doit remplacer la base de données, cela nécessitera de nombreuses modifications, ce qui est très gênant. L'émergence de Python DB-API vise à résoudre de tels problèmes. Cet article présente principalement les informations pertinentes de DB-API pour Python pour se connecter à la base de données. Les amis dans le besoin peuvent s'y référer.

Préface

Tout le monde sait que si vous souhaitez vous connecter à une base de données en Python, que ce soit MySQL, SQL Server, PostgreSQL ou SQLite , utilisez Les curseurs sont toujours utilisés, vous devez donc apprendre Python DB-API.

Tous les programmes d'interface de base de données Python sont conformes dans une certaine mesure à la spécification Python DB-API. DB-API définit une série d'objets et de méthodes d'accès aux bases de données nécessaires pour fournir des interfaces d'accès cohérentes pour divers systèmes de bases de données sous-jacents et divers programmes d'interface de bases de données. Étant donné que DB-API fournit une interface d'accès cohérente pour différentes bases de données, le portage du code entre différentes bases de données devient une tâche facile.

Processus de base de données de connexion Python :

Explication détaillée de la connexion DB-API pour Python à lapprentissage de la base de données

Créé à l'aide de Connect connection

La méthode connect génère un objet connect via lequel nous accédons à la base de données. Les modules conformes à la norme implémenteront la méthode connect.

Les paramètres de la fonction de connexion sont les suivants :

  • user Nom d'utilisateur

  • mot de passe Mot de passe

  • nom d'hôte de l'hôte

  • nom de la base de données

  • dsn Nom de la source de données

Les paramètres de connexion à la base de données peuvent être fournis sous la forme d'une chaîne DSN, exemple : connect(dsn='host:MYDB',user='root',password=' ')
Bien entendu, les différents programmes d'interface de base de données peuvent présenter certaines différences, et tous ne sont pas implémentés strictement conformément aux spécifications. Par exemple, MySQLdb utilise le paramètre db au lieu du paramètre de base de données recommandé par la spécification pour indiquer la base de données à utiliser. accédé :

Paramètres disponibles lors de la connexion à MySQLdb

  • hôte : nom d'hôte de la base de données. La valeur par défaut est l'hôte local.

  • utilisateur : nom de connexion à la base de données. La valeur par défaut est l'utilisateur actuel

  • mot de passe : le secret de connexion à la base de données. >

  • db : Le nom de la base de données à utiliser. Aucun Valeur par défaut

  • port : Port TCP utilisé par le service MySQL.

  • charset : Encodage de la base de données

Paramètres disponibles lors de la connexion à psycopg2 :


    nom de base de données – nom de la base de données (mode de connexion DSN)
  • base de données – nom de la base de données
  • utilisateur – nom d'utilisateur
  • mot de passe – mot de passe
  • hôte - adresse du serveur (si la connexion par défaut Unix Socket n'est pas fournie)
  • port - port de connexion (par défaut 5432)

L'objet connect a les méthodes suivantes :


    close() : Fermez cet objet de connexion. Après la fermeture, aucune autre opération ne peut être effectuée à moins que la connexion ne soit à nouveau créée
  • commit() : Soumettez la transaction en cours. la base de données prend en charge les transactions et il n'y a pas de validation après l'ajout, la suppression ou la modification, la base de données sera annulée par défaut
  • rollback( ): Annuler la transaction en cours
  • cursor() : Créer un objet curseur

Utiliser le curseur pour créer un objet curseur
L'objet curseur a les propriétés et méthodes suivantes :


Méthodes courantes :


    close() : Fermez cet objet curseur
  • fetchone() : obtenez la ligne suivante de l'ensemble de résultats
  • fetchmany([size = curseur.arraysize]) : Récupère les prochaines lignes de l'ensemble de résultats
  • fetchall() : Récupère toutes les lignes restantes de l'ensemble de résultats
  • excute(sql [, args]) : Exécuter une requête ou une commande de base de données
  • excutemany(sql, args) : Exécuter plusieurs requêtes ou commandes de base de données
Attributs communs :


    connexion : créer une connexion à la base de données pour cet objet curseur
  • arraysize : combien d'enregistrements sont récupérés en une seule fois à l'aide de la méthode fetchmany(), la valeur par défaut est 1
  • lastrowid : équivalent au last_inset_id() de PHP

Autres méthodes :


    __iter__() : Créer un objet itérable (facultatif)
  • next( ) : Obtenez la ligne suivante de l'ensemble de résultats (si l'itération est prise en charge)
  • nextset() : Passe à l'ensemble de résultats suivant (s'il est pris en charge)
  • callproc(func[,args]) : Appeler une procédure stockée
  • setinputsizes(sizes) : Définir la valeur d'entrée maximale (obligatoire, mais l'implémentation spécifique est facultative )
  • setoutputsizes(sizes[,col]) : définit la taille maximale du tampon pour la récupération de grandes colonnes

Autres attributs :

  • description : Renvoie l'état d'activité du curseur (tuple contenant 7 éléments) : (name, type_code, display_size, internal_size, précision, scale, null_ok) seul name et type_cose sont requis

  • rowcount : le nombre de lignes créées ou affectées par le dernier exécution()

  • messages : les informations renvoyées par la base de données après le le curseur est exécuté Tuple (facultatif)

  • rownumber : L'index de la ligne où se trouve le curseur dans l'ensemble de résultats actuel (le numéro de la ligne de départ est 0)

Définition des erreurs dans DB-API uniquement

Relation hiérarchique des classes d'erreurs :

StandardError
|__Warning
|__Error
|__InterfaceError
|__DatabaseError
|__DataError
|__OperationalError
|__IntegrityError
|__InternalError
|__ProgrammingError
|__NotSupportedError
Copier après la connexion

Exemple d'opération de base de données

Le code est le suivant :

#! /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()
Copier après la connexion

Pour plus d'articles connexes sur DB-API pour la connexion Python à l'apprentissage de bases de données, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal