python pyodbc使用方法

2021-10-08 04:27:46 字數 4789 閱讀 8534

1、連線資料庫

pip install pyodbc 成功後就可以用了

首先要import pyodbc

1)直接連線資料庫和建立乙個游標(cursor)

cnxn = pyodbc.connect('driver=;server=localhost;database=testdb;uid=me;pwd=pass')

cursor = cnxn.cursor()

2)使用dsn連線。通常dsn連線並不需要密碼,還是需要提供乙個psw的關鍵字。

cnxn = pyodbc.connect('dsn=test;pwd=password')

cursor = cnxn.cursor()

2、資料查詢(sql語句為 select ...from..where)

1)所有的sql語句都用cursor.execute函式執行。如果語句返回行,比如乙個查詢語句返回的行,你可以通過游標的fetch函式來獲取資料,這些函式有(fetchone,fetchall,fetchmany).如果返回空行,fetchone函式將返回none,而fetchall和fetchmany將返回乙個空列。

cursor.execute("select user_id, user_name from users")

row = cursor.fetchone()

if row:

print row

2)row這個類,類似於乙個元組,但是他們也可以通過欄位名進行訪問。

cursor.execute("select user_id, user_name from users")

row = cursor.fetchone()

print 'name:', row[1] # access by column index

print 'name:', row.user_name # or access by name

3)如果所有的行都被檢索完,那麼fetchone將返回none.

while 1:

row = cursor.fetchone()

if not row:

break

print 'id:', row.user_id

4)使用fetchall函式時,將返回所有剩下的行,如果是空行,那麼將返回乙個空列。(如果有很多行,這樣做的話將會占用很多記憶體。未讀取的行將會被壓縮存放在資料庫引擎中,然後由資料庫伺服器分批傳送。一次只讀取你需要的行,將會大大節省記憶體空間)

cursor.execute("select user_id, user_name from users")

rows = cursor.fetchall()

for row in rows:

print row.user_id, row.user_name

5)如果你打算一次讀完所有資料,那麼你可以使用cursor本身。

cursor.execute("select user_id, user_name from users"):

for row in cursor:

print row.user_id, row.user_name

6)由於cursor.execute返回乙個cursor,所以你可以把上面的語句簡化成:

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

print row.user_id, row.user_name

7)有很多sql語句用單行來寫並不是很方便,所以你也可以使用三引號的字串來寫:

cursor.execute("""

select user_id, user_name

from users

where last_logon < '2001-01-01'

and bill_overdue = 'y'

""")

3、引數

1)odbc支援在sql語句中使用乙個問號來作為引數。你可以在sql語句後面加上值,用來傳遞給sql語句中的問號。

cursor.execute("""

select user_id, user_name

from users

where last_logon < ?

and bill_overdue = ?

""", '2001-01-01', 'y')

這樣做比直接把值寫在sql語句中更加安全,這是因為每個引數傳遞給資料庫都是單獨進行的。如果你使用不同的引數而執行同樣的sql語句,這樣做也更加效率。

3)python db api明確說明多引數時可以使用乙個序列來傳遞。pyodbc同樣支援:

cursor.execute("""

select user_id, user_name

from users

where last_logon < ?

and bill_overdue = ?

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

cursor.execute("select count(*) as user_count from users where age > ?", 21) 

row = cursor.fetchone()

print '%d users' % row.user_count

4、資料插入

1)資料插入,把sql插入語句傳遞給cursor的execute函式,可以伴隨任何需要的引數。

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

cnxn.commit()

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

cnxn.commit()

注意呼叫cnxn.commit()函式:你必須呼叫commit函式,否者你對資料庫的所有操作將會失效!當斷開連線時,所有懸掛的修改將會被重置。這很容易導致出錯,所以你必須記得呼叫commit函式。

5、資料修改和刪除

1)資料修改和刪除也是跟上面的操作一樣,把sql語句傳遞給execute函式。但是我們常常想知道資料修改和刪除時,到底影響了多少條記錄,這個時候你可以使用cursor.rowcount的返回值。

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

print cursor.rowcount, 'products deleted'

cnxn.commit()

2)由於execute函式總是返回cursor,所以有時候你也可以看到像這樣的語句:(注意rowcount放在最後面)

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

cnxn.commit()

同樣要注意呼叫cnxn.commit()函式

6、小竅門

1)由於使用單引號的sql語句是有效的,那麼雙引號也同樣是有效的:

deleted = cursor.execute("delete from products where id <> 'pyodbc'").rowcount
2)假如你使用的是三引號,那麼你也可以這樣使用:

deleted = cursor.execute("""

delete

from products

where id <> 'pyodbc'

""").rowcount

3)有些資料庫(比如sql server)在計數時並沒有產生列名,這種情況下,你想訪問資料就必須使用下標。當然你也可以使用「as」關鍵字來取個列名(下面sql語句的「as name-count」)

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

print '%s users' % row.user_count

4)假如你只是需要乙個值,那麼你可以在同乙個行局中使用fetch函式來獲取行和第乙個列的所有資料。

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

print '%s users' % count

如果列為空,將會導致該語句不能執行。fetchone()函式返回none,而你將會獲取乙個錯誤:nonetype不支援下標。如果有乙個預設值,你能常常使用isnull,或者在sql資料庫直接合併nulls來覆蓋掉預設值。

maxid = cursor.execute("select coalesce(max(id), 0) from users").fetchone()[0]
在這個例子裡面,如果max(id)返回null,coalesce(max(id),0)將導致查詢的值為0。

dbms output put line使用方法

begin dbms output.put line a end 如果你是再sql plus中,只要再環境中打出 set serveroutput on 就可以了.還有一種方法 就是使用環境中的繫結變數也可以.再環境中定義 variable name varchar2 50 然後把過程新增乙個out...

sp addlinkedserver使用方法

exec sp droplinkedsrvlogin dbvip,null exec sp dropserver dbvip exec sp addlinkedserver server dbvip 被訪問的伺服器別名 srvproduct provider sqloledb datasrc ser...

SQL Server Profiler使用方法

一 sql server profiler使用方法 1 單擊開始 程式 microsoft sql server 2005 效能工具 sql server profiler,如下圖 2 彈出sql server profiler視窗,如下圖 3 在工作視窗內,滑鼠單擊 檔案 新建跟蹤 n 彈出資料庫...