資料庫表是乙個二維表,包含多行多列。把乙個表的內容用python的資料結構表示出來的話,可以用乙個list表示多行,list的每乙個元素是tuple,表示一行記錄,比如,包含id
和name
的user
表:
[
('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 ...