Python使用pyodbc訪問資料庫操作方法詳解

2022-10-04 19:18:15 字數 4326 閱讀 8117

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()

關於連線函式還有更多的選項,可以在pyodbc文件中的 connect funtion 和 connectionstrings檢視更多的細節

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:

printrow

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()

ifnot 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:

printrow.user_id, row.user_name

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

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

for row in cursor:

printrow.user_id, row.user_name

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

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

printrow.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'

""")

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

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函式。

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

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

printcursor.rowcount, 'products deleted'

cnxn.commit()

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

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

cnxn.commit()

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

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

deleted =cursor.exe程式設計客棧cute("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函式來獲取行和第乙個列的所有資料。

co =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。

如何使用pyodbc

在cmd下執行pip install pyodbc即可 首先檢視自己的drivers,執行如下 import pyodbc print pyodbc.drivers 執行結果如下,將紅框中的內容記錄下來,作為之後connect中driver的值。2.如果你使用windows身份認證,請按照如下 連線...

Python資料庫操作 pyodbc

使用pip或者pipnv方式安裝均可。pip install pyodbcpipenv install pyodbc訪問access資料庫,需要手動安裝access資料庫引擎。需要注意,access資料庫引擎版本和位數需要和office對應,否則會安裝失敗。以下 均在office2016 64bit...

python控制網分為 python的類訪問控制

在python類中,有屬性和方法,外部 可以直接通過例項來訪問修改。如果需要讓內部的屬性不被外部訪問到,在屬性變數前面加上 2個下劃線。在python中,例項的變數名如果是由 2個下花錢開頭的,就代表這是乙個私有變數 只有內部可以訪問,外部不許直接通過類或者例項訪問。雖然說外部訪問不了乙個內部私有屬...