python 學習筆記 sqlalchemy

2022-07-25 06:15:13 字數 3422 閱讀 4340

資料庫表是乙個二維表,包含多行多列。把乙個表的內容用python的資料結構表示出來的話,可以用乙個list表示多行,list的每乙個元素是tuple,表示一行記錄,比如,包含idnameuser表:

[

('1', 'michael'),

('2', 'bob'),

('3', 'adam')

]

python的db-api返回的資料結構就是像上面這樣表示的。

但是用tuple表示一行很難看出表的結構。如果把乙個tuple用class例項來表示,就可以更容易地看出表的結構來:

class user(object):

def __init__(self, id, name):

self.id = id

self.name = name

[ user('1', 'michael'),

user('2', 'bob'),

user('3', 'adam')

]

但是由誰來做這個轉換呢?所以orm框架應運而生。

在python中,最有名的orm框架是sqlalchemy。我們來看看sqlalchemy的用法。

首先通過pip安裝sqlalchemy:

$ pip install sqlalchemy

然後,利用上次我們在mysql的test資料庫中建立的user表,用sqlalchemy來試試:

第一步,匯入sqlalchemy,並初始化dbsession:

# 匯入:

from sqlalchemy import column, string, create_engine

from sqlalchemy.orm import sessionmaker

from sqlalchemy.ext.declarative import declarative_base

# 建立物件的基類:

base = declarative_base()

# 定義user物件:

class user(base):

# 表的名字:

__tablename__ = 'user'

# 表的結構:

id = column(string(20), primary_key=true)

name = column(string(20))

# 初始化資料庫連線:

engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')

# 建立dbsession型別:

dbsession = sessionmaker(bind=engine)

以上**完成sqlalchemy的初始化和具體每個表的class定義。如果有多個表,就繼續定義其他class,例如school:

class school(base):

__tablename__ = 'school'

id = ...

name = ...

create_engine()用來初始化資料庫連線。sqlalchemy用乙個字串表示連線資訊:

你只需要根據需要替換掉使用者名稱、口令等資訊即可。

下面,我們看看如何向資料庫表中新增一行記錄。

由於有了orm,我們向資料庫表中新增一行記錄,可以視為新增乙個user物件:

# 建立session物件:

session = dbsession()

# 建立新user物件:

new_user = user(id='5', name='bob')

# 新增到session:

session.add(new_user)

# 提交即儲存到資料庫:

session.commit()

# 關閉session:

session.close()

可見,關鍵是獲取session,然後把物件新增到session,最後提交並關閉。dbsession物件可視為當前資料庫連線。

如何從資料庫表中查詢資料呢?有了orm,查詢出來的可以不再是tuple,而是user物件。sqlalchemy提供的查詢介面如下:

# 建立session:

session = dbsession()

# 建立query查詢,filter是where條件,最後呼叫one()返回唯一行,如果呼叫all()則返回所有行:

user = session.query(user).filter(user.id=='5').one()

# 列印型別和物件的name屬性:

print('type:', type(user))

print('name:', user.name)

# 關閉session:

session.close()

執行結果如下:

type: 

name: bob

可見,orm就是把資料庫表的行與相應的物件建立關聯,互相轉換。

由於關聯式資料庫的多個表還可以用外來鍵實現一對多、多對多等關聯,相應地,orm框架也可以提供兩個物件之間的一對多、多對多等功能。

例如,如果乙個user擁有多個book,就可以定義一對多關係如下:

class user(base):

__tablename__ = 'user'

id = column(string(20), primary_key=true)

name = column(string(20))

# 一對多:

books = relationship('book')

class book(base):

__tablename__ = 'book'

id = column(string(20), primary_key=true)

name = column(string(20))

# 「多」的一方的book表是通過外來鍵關聯到user表的:

user_id = column(string(20), foreignkey('user.id'))

當我們查詢乙個user物件時,該物件的books屬性將返回乙個包含若干個book物件的list。

orm框架的作用就是把資料庫表的一行記錄與乙個物件互相做自動轉換。

正確使用orm的前提是了解關聯式資料庫的原理。

python教學筆記 python學習筆記(一)

1.eval 函式 eval是單詞evaluate的縮寫,就是 求.的值的意思。eval 函式的作用是把str轉換成list,dict,tuple.li 1 1,2,3 print eval li 1 di 1 print eval di 1 tu 1 2,4,6 print eval tu 1 執...

python學習筆記

coding utf 8 coding utf 8 應該像八股文一樣在每個指令碼的頭部宣告,這是個忠告 為了解決中文相容問題,同時你應該選擇支援 unicode 編碼的編輯器環境,保證在執行指令碼中的每個漢字都是使用 utf 8 編碼過的。cdays 5 exercise 3.py 求0 100之間...

Python 學習筆記

python 學習筆記 def run print running.def execute method method execute run result running.condition false test yes,is true if condition else no,is false ...