最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python連接數(shù)據(jù)庫學(xué)習(xí)之DB-API詳解

 更新時間:2017年02月07日 11:02:41   作者:標(biāo)點(diǎn)符  
在沒有 Python DB-API 之前,各數(shù)據(jù)庫之間的應(yīng)用接口非?;靵y,實(shí)現(xiàn)各不相同。如果項(xiàng)目需要更換數(shù)據(jù)庫時,則需要做大量的修改,非常不便。Python DB-API 的出現(xiàn)就是為了解決這樣的問題。本文主要介紹了Python連接數(shù)據(jù)庫之DB-API的相關(guān)資料,需要的朋友可以參考。

前言

大家都知道在Python中如果要連接數(shù)據(jù)庫,不管是MySQLSQL ServerPostgreSQL亦或是SQLite,使用時都是采用游標(biāo)的方式,所以就不得不學(xué)習(xí)Python DB-API。

Python所有的數(shù)據(jù)庫接口程序都在一定程度上遵守 Python DB-API 規(guī)范。DB-API定義了一系列必須的對象和數(shù)據(jù)庫存取方式,以便為各種底層數(shù)據(jù)庫系統(tǒng)和多種多樣的數(shù)據(jù)庫接口程序提供一致的訪問接口。由于DB-API 為不同的數(shù)據(jù)庫提供了一致的訪問接口, 在不同的數(shù)據(jù)庫之間移植代碼成為一件輕松的事情。

Python連接數(shù)據(jù)庫流程:

使用connect創(chuàng)建connection連接

connect 方法生成一個 connect 對象, 我們通過這個對象來訪問數(shù)據(jù)庫。符合標(biāo)準(zhǔn)的模塊都會實(shí)現(xiàn) connect 方法。

connect 函數(shù)的參數(shù)如下所示:

  • user Username
  • password Password
  • host Hostname
  • database Database name
  • dsn Data source name

數(shù)據(jù)庫連接參數(shù)可以以一個 DSN 字符串的形式提供,示例:connect(dsn='host:MYDB',user='root',password=' ')
當(dāng)然,不同的數(shù)據(jù)庫接口程序可能有些差異,并非都是嚴(yán)格按照規(guī)范實(shí)現(xiàn),例如MySQLdb則使用 db 參數(shù)而不是規(guī)范推薦的 database 參數(shù)來表示要訪問的數(shù)據(jù)庫:

MySQLdb連接時可用參數(shù)

  • host: 數(shù)據(jù)庫主機(jī)名.默認(rèn)是用本地主機(jī)
  • user: 數(shù)據(jù)庫登陸名.默認(rèn)是當(dāng)前用戶
  • passwd: 數(shù)據(jù)庫登陸的秘密.默認(rèn)為空
  • db: 要使用的數(shù)據(jù)庫名.沒有默認(rèn)值
  • port: MySQL服務(wù)使用的TCP端口.默認(rèn)是3306
  • charset: 數(shù)據(jù)庫編碼

psycopg2連接時可用參數(shù):

  • dbname – 數(shù)據(jù)庫名稱 (dsn連接模式)
  • database – 數(shù)據(jù)庫名稱
  • user – 用戶名
  • password – 密碼
  • host – 服務(wù)器地址 (如果不提供默認(rèn)連接Unix Socket)
  • port – 連接端口 (默認(rèn)5432)

其中connect對象又有如下方法:

  • close():關(guān)閉此connect對象, 關(guān)閉后無法再進(jìn)行操作,除非再次創(chuàng)建連接
  • commit():提交當(dāng)前事務(wù),如果是支持事務(wù)的數(shù)據(jù)庫執(zhí)行增刪改后沒有commit則數(shù)據(jù)庫默認(rèn)回滾
  • rollback():取消當(dāng)前事務(wù)
  • cursor():創(chuàng)建游標(biāo)對象

使用cursor創(chuàng)建游標(biāo)對象

cursor游標(biāo)對象又有如下屬性和方法:

常用方法:

  • close():關(guān)閉此游標(biāo)對象
  • fetchone():得到結(jié)果集的下一行
  • fetchmany([size = cursor.arraysize]):得到結(jié)果集的下幾行
  • fetchall():得到結(jié)果集中剩下的所有行
  • excute(sql[, args]):執(zhí)行一個數(shù)據(jù)庫查詢或命令
  • excutemany(sql, args):執(zhí)行多個數(shù)據(jù)庫查詢或命令

常用屬性:

  • connection:創(chuàng)建此游標(biāo)對象的數(shù)據(jù)庫連接
  • arraysize:使用fetchmany()方法一次取出多少條記錄,默認(rèn)為1
  • lastrowid:相當(dāng)于PHP的last_inset_id()

其他方法:

  • __iter__():創(chuàng)建一個可迭代對象(可選)
  • next():獲取結(jié)果集的下一行(如果支持迭代的話)
  • nextset():移到下一個結(jié)果集(如果支持的話)
  • callproc(func[,args]):調(diào)用一個存儲過程
  • setinputsizes(sizes):設(shè)置輸入最大值(必須有,但具體實(shí)現(xiàn)是可選的)
  • setoutputsizes(sizes[,col]):設(shè)置大列 fetch 的最大緩沖區(qū)大小

其他屬性:

  • description:返回游標(biāo)活動狀態(tài)(包含7個元素的元組):(name, type_code, display_size, internal_size, precision, scale, null_ok)只有 name 和 type_cose 是必需的
  • rowcount:最近一次 execute() 創(chuàng)建或影響的行數(shù)
  • messages:游標(biāo)執(zhí)行后數(shù)據(jù)庫返回的信息元組(可選)
  • rownumber:當(dāng)前結(jié)果集中游標(biāo)所在行的索引(起始行號為 0)

DB-API只中的錯誤定義

錯誤類的層次關(guān)系:

StandardError
|__Warning
|__Error
|__InterfaceError
|__DatabaseError
|__DataError
|__OperationalError
|__IntegrityError
|__InternalError
|__ProgrammingError
|__NotSupportedError

數(shù)據(jù)庫操作示例

代碼如下:

#! /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

# 連接數(shù)據(jù)庫
db_conn = MySQLdb.connect(host = 'localhost', user= 'root', passwd = '123456')

# 如果已經(jīng)創(chuàng)建了數(shù)據(jù)庫,可以直接用如下方式連接數(shù)據(jù)庫
#db_conn = MySQLdb.connect(host = "localhost", user = "root",passwd = "123456", db = "testdb")

"""
connect方法常用參數(shù):
 host: 數(shù)據(jù)庫主機(jī)名.默認(rèn)是用本地主機(jī)
 user: 數(shù)據(jù)庫登陸名.默認(rèn)是當(dāng)前用戶
 passwd: 數(shù)據(jù)庫登陸的秘密.默認(rèn)為空
 db: 要使用的數(shù)據(jù)庫名.沒有默認(rèn)值
 port: MySQL服務(wù)使用的TCP端口.默認(rèn)是3306
 charset: 數(shù)據(jù)庫編碼
"""

# 獲取操作游標(biāo) 
cursor = db_conn.cursor()

# 使用 execute 方法執(zhí)行SQL語句
cursor.execute("SELECT VERSION()")

# 使用 fetchone 方法獲取一條數(shù)據(jù)庫。
dbversion = cursor.fetchone()

print "Database version : %s " % dbversion

# 創(chuàng)建數(shù)據(jù)庫
cursor.execute("create database if not exists dbtest")

# 選擇要操作的數(shù)據(jù)庫
db_conn.select_db('dbtest');

# 創(chuàng)建數(shù)據(jù)表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

# 插入數(shù)據(jù)
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:
 # 清空表中數(shù)據(jù)
 cursor.execute("delete from employee")
 # 執(zhí)行 sql 插入語句
 for employee in employees:
  cursor.execute(sql % (employee["first_name"], \
   employee["last_name"], \
   employee["age"], \
   employee["sex"], \
   employee["income"]))
 # 提交到數(shù)據(jù)庫執(zhí)行
 db_conn.commit()
 # 對于支持事務(wù)的數(shù)據(jù)庫, 在Python數(shù)據(jù)庫編程中,
 # 當(dāng)游標(biāo)建立之時,就自動開始了一個隱形的數(shù)據(jù)庫事務(wù)。
 # 用 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 是一個只讀屬性,并返回執(zhí)行execute(方法后影響的行數(shù)。)

# 數(shù)據(jù)庫查詢操作:
# fetchone()  得到結(jié)果集的下一行 
# fetchmany([size=cursor.arraysize]) 得到結(jié)果集的下幾行 
# fetchall()  返回結(jié)果集中剩下的所有行 
try:
 # 執(zhí)行 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

# 數(shù)據(jù)庫更新操作
sql = "UPDATE employee SET age = age + 1 WHERE sex = '%c'" % ('M')
try:
 # 執(zhí)行SQL語句
 cursor.execute(sql)
 # 提交到數(shù)據(jù)庫執(zhí)行
 db_conn.commit()
 cursor.execute("select * from employee")
 ars = cursor.fetchall()
 print "After update: ------"
 for rs in ars:
  print rs
except Exception, e:
 # 發(fā)生錯誤時回滾
 print "Error to update:", e
 db.rollback()

# 關(guān)閉數(shù)據(jù)庫連接
db_conn.close()

其他參考文檔:

https://www.python.org/dev/peps/pep-0249/

http://wiki.python.org/moin/DatabaseInterfaces

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • 圖文詳解Django使用Pycharm連接MySQL數(shù)據(jù)庫

    圖文詳解Django使用Pycharm連接MySQL數(shù)據(jù)庫

    這篇文章主要介紹了Django使用Pycharm連接MySQL數(shù)據(jù)庫的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • python中protobuf和json互相轉(zhuǎn)換應(yīng)用處理方法

    python中protobuf和json互相轉(zhuǎn)換應(yīng)用處理方法

    protobuf目前有proto2和proto3兩個版本,本文所介紹的是基于proto3,在Python 3.6.9環(huán)境下運(yùn)行,本文記錄一下python中protobuf和json的相互轉(zhuǎn)換的處理方法,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • 基于python實(shí)現(xiàn)一個簡單的瀏覽器引擎

    基于python實(shí)現(xiàn)一個簡單的瀏覽器引擎

    瀏覽器引擎是用來處理、渲染和顯示網(wǎng)頁內(nèi)容的核心組件,其主要任務(wù)是將用戶輸入的URL所代表的網(wǎng)頁資源加載并呈現(xiàn)出來,通常包括HTML、CSS、JavaScript以及各種多媒體內(nèi)容,本文給大家介紹了如何基于python實(shí)現(xiàn)一個簡單的瀏覽器引擎,需要的朋友可以參考下
    2024-10-10
  • Python中創(chuàng)建相關(guān)系數(shù)矩陣的方法小結(jié)

    Python中創(chuàng)建相關(guān)系數(shù)矩陣的方法小結(jié)

    相關(guān)系數(shù)矩陣是一種用于衡量變量之間關(guān)系的重要工具,本文將介紹在 Python 中創(chuàng)建相關(guān)系數(shù)矩陣的不同方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • Python設(shè)計(jì)模式之工廠方法模式實(shí)例詳解

    Python設(shè)計(jì)模式之工廠方法模式實(shí)例詳解

    這篇文章主要介紹了Python設(shè)計(jì)模式之工廠方法模式,結(jié)合實(shí)例形式較為詳細(xì)的分析了工廠方法模式的概念、原理、用法及相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01
  • Python爬蟲爬取疫情數(shù)據(jù)并可視化展示

    Python爬蟲爬取疫情數(shù)據(jù)并可視化展示

    這篇文章主要介紹了Python利用爬蟲爬取疫情數(shù)據(jù)并進(jìn)行可視化的展示,文中的示例代碼講解清晰,對工作或?qū)W習(xí)有一定的價值,需要的朋友可以參考一下
    2021-12-12
  • Python面向?qū)ο蠡A(chǔ)入門之設(shè)置對象屬性

    Python面向?qū)ο蠡A(chǔ)入門之設(shè)置對象屬性

    這篇文章主要給大家介紹了關(guān)于Python面向?qū)ο蠡A(chǔ)入門之設(shè)置對象屬性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • scrapy-splash簡單使用詳解

    scrapy-splash簡單使用詳解

    這篇文章主要介紹了scrapy-splash簡單使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python中暫存上傳圖片的方法

    Python中暫存上傳圖片的方法

    這篇文章主要介紹了Python中暫存上傳圖片的方法,本文使用cStringIO模塊實(shí)現(xiàn)暫存功能,本文給出簡單使用示例,需要的朋友可以參考下
    2015-02-02
  • Python實(shí)現(xiàn)隨機(jī)生成有效手機(jī)號碼及身份證功能示例

    Python實(shí)現(xiàn)隨機(jī)生成有效手機(jī)號碼及身份證功能示例

    這篇文章主要介紹了Python實(shí)現(xiàn)隨機(jī)生成有效手機(jī)號碼及身份證功能,結(jié)合完整實(shí)例形式分析了Python基于手機(jī)號與身份證算法實(shí)現(xiàn)隨機(jī)手機(jī)號及身份證的生成功能,涉及Python日期、隨機(jī)數(shù)、文件讀取等相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06

最新評論

昂仁县| 平舆县| 民丰县| 驻马店市| 银川市| 克山县| 舞钢市| 东方市| 邻水| 永寿县| 织金县| 巴青县| 榆中县| 鹿泉市| 苏尼特左旗| 资源县| 全椒县| 内丘县| 仲巴县| 天等县| 商河县| 抚州市| 友谊县| 乐山市| 延庆县| 黎川县| 容城县| 桓台县| 错那县| 太原市| 濮阳市| 安顺市| 石嘴山市| 孟津县| 鹤壁市| 鲁甸县| 泰顺县| 仪陇县| 乌鲁木齐县| 大关县| 湘西|