資料庫表是乙個二維表,包含多行多列。把乙個表的內容用python的資料結構表示出來的話,可以用乙個list表示多行,list的每乙個元素是tuple,表示一行記錄,比如,包含id
和name
的user
表:
[('1', '
michael'),
('2', '
bob'
), ('3
', '
adam')
]
python的db-api返回的資料結構就是像上面這樣表示的。
但是用tuple表示一行很難看出表的結構。如果把乙個tuple用class例項來表示,就可以更容易地看出表的結構來
classuser(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的用法。
首先通過easy_install或者pip安裝sqlalchemy:
$ easy_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:
classschool(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,最後提交並關閉。session物件可視為當前資料庫連線。
如何從資料庫表中查詢資料呢?有了orm,查詢出來的可以不再是tuple,而是user
物件。sqlalchemy提供的查詢介面如下:
#建立session:
session =dbsession()
#建立query查詢,filter是where條件,最後呼叫one()返回唯一行,如果呼叫all()則返回所有行:
user = session.query(user).filter(user.id=='5'
).one()
#列印型別和物件的name屬性:
'type:
', type(user)
'name:
', user.name
#關閉session:
session.close()
執行結果如下:
type: '__main__.user'>name: bob
可見,orm就是把資料庫表的行與相應的物件建立關聯,互相轉換。
由於關聯式資料庫的多個表還可以用外來鍵實現一對多、多對多等關聯,相應地,orm框架也可以提供兩個物件之間的一對多、多對多等功能。
例如,如果乙個user擁有多個book,就可以定義一對多關係如下:
classuser(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中sqlalchemy模組的使用二
廢話不多說,咱們直接上 1 使用in查詢 def use in session dbsession users session.query user filter user.name.in zhangsan lisi all print user for user in users 執行結果 sql...
flask 與 SQLAlchemy的使用
安裝模組 pip install flask sqlalchemy在單個python中與flask使用 檔名 manage.py from flask sqlalchemy import sqlalchemy from flask import flask user root password ro...
sqlalchemy 中 desc 的使用
是這樣 items item.query.order by item.date.desc all 而不是這樣 items item.query.order by desc item.date all 更不是說了一大堆sqlalchemy的查詢方式別人看半天也沒找到自己需要的。sqlalchemy 中...