1. 程式人生 > >pyodbc訪問資料庫(python ODBC訪問資料庫)

pyodbc訪問資料庫(python ODBC訪問資料庫)

入門

連線到資料庫

呼叫connect方法並傳入ODBC連線字串,其會返回一個connect物件。通過connect物件,呼叫cursor()方法,可以獲取一個遊標cursor。如下程式碼示例:

import pyodbc

#連線示例: Windows系統, DSN方式, 使用微軟 SQL Server 資料庫驅動

cnxn =pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;PORT=1433;DATABASE=testdb;UID=me;PWD=pass')

#連線示例: Linux系統, DSN方式, 使用FreeTDS驅動

cnxn =pyodbc.connect('DRIVER={FreeTDS};SERVER=localhost;PORT=1433;DATABASE=testdb;UID=me;PWD=pass;TDS_Version=7.0')

#連線示例:使用DSN方式

cnxn = pyodbc.connect('DSN=test;PWD=password')

# 開啟遊標

cursor =cnxn.cursor()

以上示例只是標準示例,具體的ODBC連線字串以你自己使用的驅動為準。

查詢一些資料

所有SQL語句都使用Cursor.execute()方法執行。比如select語句會返回一些結果行,你可以使用遊標(

Cursor)相關的函式功能(fetchonefetchallfetchmany)對結果進行檢索。

Cursor.fetchone 用於返回一個單行(Row)物件:

cursor.execute("selectuser_id, user_name from users")

row =cursor.fetchone()

if row:

    print(row)

Row物件是類似一個python元組(tuples),不過也可以通過列名稱來訪問,例如:

cursor.execute("selectuser_id, user_name from users")

row =cursor.fetchone()

print('name:',row[1])         # 使用列索引號來訪問資料

print('name:',row.user_name)  # 或者直接使用列名來訪問資料

當所有行都已被檢索,則fetchone返回None.

while 1:

    row = cursor.fetchone()

    if not row:

        break

    print('id:', row.user_id)

Cursor.fetchall方法返回所有剩餘行並存儲於一個列表中。如果沒有行,則返回一個空列表。(注意:如果有很多行,會造成大量記憶體佔用。Fetchall會一次性將所有資料查詢到本地,然後再遍歷)

cursor.execute("selectuser_id, user_name from users")

rows = cursor.fetchall()

for row in rows:

    print(row.user_id, row.user_name)

如果並不在意資料處理時間,可以使用游標本身作為一個迭代器,逐行迭代。這樣可以節省大量的記憶體開銷,但是由於和資料來回進行通訊,速度會相對較慢:

cursor.execute("selectuser_id, user_name from users"):

for row in cursor:

    print(row.user_id, row.user_name)

由於Cursor.execute總是返回遊標(cursor, 所以也可以簡寫成:

for row incursor.execute("select user_id, user_name from users"):

    print(row.user_id, row.user_name)

我們可以在execut中使用”””三重引號,來應用多行SQL字串。這樣sql的可讀性大大增強。這是python特有的特性:

cursor.execute(

    """

    select user_id, user_name

      from users

     where last_logon < '2001-01-01'

           and bill_overdue = 1

    """)

SQL引數

ODBC支援使用問號作為SQL的查詢引數佔位符。可以在execute方法的SQL引數之後,提供SQL引數佔位符的值:

cursor.execute(

    """

    select user_id, user_name

      from users

     where last_logon < ?

           and bill_overdue = ?

    """, '2001-01-01', 1)

這樣做可以防止SQL注入攻擊,提高安全性。如果使用不同的引數反覆執行相同的SQL它效率會更高,這種情況下該SQL將只預裝(prepared)一次。pyodbc只保留最後一條編寫的語句,所以如果程式在語句之間進行切換,每次都會預裝,造成多次預裝。)

PythonDB API指定引數應以序列(sequence)物件傳遞,所以pyodbc也支援這種方式:

cursor.execute(

    """

    select user_id, user_name

      from users

     where last_logon < ?

           and bill_overdue = ?

    """, ['2001-01-01', 1])

插入資料

插入資料使用相同的函式 - 通過傳入insert SQL和相關佔位引數執行插入資料:

cursor.execute("insertinto products(id, name) values ('pyodbc', 'awesome library')")

cnxn.commit()

cursor.execute("insertinto products(id, name) values (?, ?)", 'pyodbc', 'awesome library')

cnxn.commit()

注意:呼叫cnxn.commit()。發成錯誤可以回滾。具體需要看資料庫特性支援情況。如果資料發生改變,最好進行commit。如果不提交,則在連線中斷時,所有資料會發生回滾。

更新和刪除資料

更新和刪除工作以同樣的方式:通過特定的SQL來執行。通常我們都想知道更新和刪除的時候有多少條記錄受到影響,可以使用Cursor.rowcount來獲取值:

cursor.execute("deletefrom products where id <> ?", 'pyodbc')

print('Deleted {}inferior products'.format(cursor.rowcount))

cnxn.commit()

由於execute總是返回遊標(允許你呼叫鏈或迭代器使用),有時我們直接這樣簡寫:

deleted =cursor.execute("delete from products where id <> 'pyodbc'").rowcount

cnxn.commit()

注意一定要呼叫commit。否則連線中斷時會造成改動回滾。

技巧和竅門

引號

於單引號SQL是有效的,當值需要使用單引號時,使用用雙引號包圍的SQL:

cursor.execute("deletefrom products where id <> 'pyodbc'")

如果使用三重引號, 我們可以這樣使用單引號:

cursor.execute(

    """

    delete

      from products

     where id <> 'pyodbc'

    """)

列名稱

Microsoft SQLServer之類的一些資料庫不會產生計算列的列名,在這種情況下,需要通過索引來訪問列。我們也可以使用sql列別名的方式,為計算列指定引用名稱:

row =cursor.execute("select count(*) as user_count fromusers").fetchone()

print('{}users'.format(row.user_count)

當然也可以直接使用列索引來訪問列值:

count =cursor.execute("select count(*) from users").fetchone()[0]

print('{}users'.format(count)

注意,上例的首列不能是Null。否則fetchone方法將返回None並且會報NoneType不支援索引的錯誤。如果有一個預設值,經常可以是ISNULL或合併:

maxid =cursor.execute("select coalesce(max(id), 0) fromusers").fetchone()[0]

自動清理

連線(預設)在一個事務中。如果一個連線關閉前沒有提交,則會進行當前事務回滾。很少需要finallyexcept語句來執行人為的清理操作,程式會自動清理。

例如,如果下列執行過程中任何一條SQL語句出現異常,都將引發導致這兩個遊標執行失效。從而保證原子性,要麼所有資料都插入發生,要麼所有資料都不插入。不需要人為編寫清理程式碼。

cnxn =pyodbc.connect(...)

cursor = cnxn.cursor()

cursor.execute("insertinto t(col) values (1)")

cursor.execute("insertinto t(col) values (2)")

cnxn.commit()

相關推薦

pyodbc訪問資料庫python ODBC訪問資料庫

入門 連線到資料庫 呼叫connect方法並傳入ODBC連線字串,其會返回一個connect物件。通過connect物件,呼叫cursor()方法,可以獲取一個遊標cursor。如下程式碼示例: import pyodbc #連線示例: Windows系統, 非DSN方

JDBC驅動直接訪問MySQL資料庫純Java驅動程式

       純Java驅動方式由JDBC驅動直接訪問資料庫,驅動程式完全由Java語言編寫,執行速度快,而且具備了跨平臺的特點。使用純Java驅動方式進行資料庫連線,首先需要下載資料庫廠商提供的驅動程式JAR包,並將JAR包引入工程中。本示例使用的資料庫是MySQL 5.5

python ODBC 操作資料庫

 import pyodbcdef init_db():  try:      conn = pyodbc.connect('DRIVER=SQL Server Native Client 10.0;SERVER=10.10.10.166;DATABASE=diaodu;UID=sa;PWD=sjtu1234

djangopython manage.py imgrate同步資料庫出錯後的解決辦法

很多情況下,因為app的models.py的檔案內容有誤,但是通過python   manage.py    check檢查不出來時,當執行python   manage.py    migrate同

python訪問限制下劃線的用法

私有 成員 ted 實例名 ini protect init 方法 import python通過在屬性或者方法名前面加 單下劃線,雙下劃線,首尾雙下劃線 來限制訪問權限。 1.首尾雙下劃線:定義特殊方法,一般是系統名,如__init__() 2.單下劃線:表示

lamp-配置防盜鏈、訪問控制Directory針對目錄訪問控制針對單文件

lamp 訪問控制 防盜鏈 directory 配置防盜鏈 防止服務器的圖片和其他資源被非本機的站點引用,被其他網站引用後會導致流量圖片的用戶的數量暴增,而帶寬流量增加、增加站點的成本; 編輯虛擬配置文件 vim /usr/local/apache2.4/conf/extra/httpd-vh

RMAN遷移資料庫不改變檔案目錄

1、目標庫建立相應目錄mkdir -p /u01/app/oracle/oradata/orclmkdir -p /u01/app/oracle/fast_recovery_area/ORCLmkdir -p /u01/app/oracle/admin/orcl/{a,dp}dump 2、目標庫建立密碼檔案

送你9個常用的人臉資料庫附連結、報告

本文主要介紹以下幾種常用的人臉資料庫: 1. FERET人臉資料庫 http://www.nist.gov/itl/iad/ig/colorferet.cfm 由FERET專案建立,此影象集包含大量的人臉影象,並且每幅圖中均只有一個人臉。該集中,同一個人的照片有不同表情、光照、姿態和年齡的變化。包含1萬

nginx通過域名訪問專案不接專案名稱,cookie丟失問題

  最近搞了個域名,想用它直接去訪問Tomcat上部署的專案,開始一直必須加上專案名稱,經過短暫配置,成功了。 訪問一次,到達登陸頁面,結果死活登入不進去,一直在登陸介面,原來是由於cookie丟失,現配置如下,完美解決問題: server { listen

centos7 yum配置安裝Mariadb資料庫使用國內Mariadb源

CentOS 6 或早期的版本中提供的是 MySQL 的伺服器/客戶端安裝包,但 CentOS 7 已使用了 MariaDB 替代了預設的 MySQL。MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社群在維護,採用GPL授權許可 MariaDB的目的是完全相容MySQL,包括AP

express路由中使用mongoDB資料庫靜態介面local..:8081

var express = require('express'); var app = express(); var MongoClient = require('mongodb').MongoClient; var url = "mongodb://127.0.0.1:27017"; app.

解決Could not install packages due to an EnvironmentError: [WinError 5] 拒絕訪問win10下升級pip

一、問題描述 在dos下升級pip時,報錯如下: “Could not install packages due to an EnvironmentError: [WinError 5] 拒絕訪問。: 'c:\\program files\\python37\\lib\\site-packa

tomcat無法訪問問題curl 介面重定向

今天給樹莓派用docker裝tomcat,啟動後發現無法訪問 怎麼curl返回都是空,看日誌也沒報錯 最後通過netstat -ano|grep 8080發現,埠繫結在ipv6地址上。 解決方案: 在tomcat的bin目錄下新建setenv.sh,內容為: JA

fedora下安裝與配置mariadb資料庫mysql的一個分支

1.安裝命令: yum install mariadb yum install mariadb-server yum install mariadb-devel(開發元件) 2.啟動和停止服務: service mariadb start service maria

資料庫 JDBC增刪改查

                                                 開發步驟 一.匯入jar包   1.匯入mysql-connector-java-5.1.0-bin.jar包; 二.寫實體類:(實體層) package com.y

JDBC連線資料庫以mysql為例

步驟: 1、在專案裡面配置驅動(右擊專案->built path->configure built path->libraries->add External JARs...),新增資料庫的驅動jar包(本例mysql驅動包v5.0.8)網上下載驅動

Redis資料庫安裝, Python操作Redis資料庫

一. 安裝 1.將Redis路徑新增到環境變數. 2.將解壓包放到指定碟符後解壓縮, 開啟一個 cmd 視窗 使用 cd 命令切換到Redis目錄後, 再輸入命令: redis-server.exe redis.windows.conf 如果顯示以下介面即安裝

node外部處理mongoDB資料庫小白的筆記

node外部處理mongoDB資料庫(小白的筆記) index.js裡面完成對mongoDB資料庫的操作 const mongodb = require('mongodb') const { MongoClient, ObjectId } = mongodb

java程式設計師第十六課 -MySQL資料庫多表的查詢

課程回顧:MySQL資料庫和SQL語言 資料庫的概述 1.資料庫的作用:倉庫,儲存資料。 2.關係型的資料庫,儲存實體與實體之間的關係。 3.常見的資料庫 * Oracle MySQL SQLServer DB2 MySQL資料庫的安裝和解

python操作三大主流資料庫(8)python操作mongodb資料庫python使用pymongo操作mongodb的增刪改查...

python操作mongodb資料庫②python使用pymongo操作mongodb的增刪改查 文件http://api.mongodb.com/python/current/api/index.htmlhttp://api.mongodb.com/python/current/api/pymongo/co