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.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只保留最後一條編寫的語句,所以如果程式在語句之間進行切換,每次都會預裝,造成多次預裝。)
Python的DB 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]
自動清理
連線(預設)在一個事務中。如果一個連線關閉前沒有提交,則會進行當前事務回滾。很少需要finally或except語句來執行人為的清理操作,程式會自動清理。
例如,如果下列執行過程中任何一條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
django(python 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