何謂ORM
Object Relational Mapping(對(duì)象關(guān)系映射)
ORM用途
ORM把對(duì)象模型表示的對(duì)象映射到基于SQL 的關(guān)系模型數(shù)據(jù)庫(kù)結(jié)構(gòu)中去总棵。這樣,我們?cè)诰唧w的操作實(shí)體對(duì)象的時(shí)候戏罢,就不需要再去和復(fù)雜的 SQ L 語(yǔ)句打交道字币,只需簡(jiǎn)單的操作實(shí)體對(duì)象的屬性和方法 疾掰。
ORM模型的簡(jiǎn)單性簡(jiǎn)化了數(shù)據(jù)庫(kù)查詢(xún)過(guò)程。使用ORM查詢(xún)工具听皿,用戶(hù)可以訪(fǎng)問(wèn)期望數(shù)據(jù)熟呛,而不必理解數(shù)據(jù)庫(kù)的底層結(jié)構(gòu)。
使用示例
SQLAlchemy是Python中最流行的ORM庫(kù)之一,這里使用SQLAlchemy作為示例講解.
連接一個(gè)僅內(nèi)存的SQLite數(shù)據(jù)庫(kù):
>>> from sqlalchemy import create_engine
>>> engine = create_engine('sqlite:///:memory:', echo=True)
聲明映射,生成基類(lèi):
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
定義一個(gè)表(類(lèi)):
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (
self.name, self.fullname, self.password)
我們現(xiàn)在創(chuàng)建并檢查User對(duì)象:
>>> ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
>>> ed_user.name
'ed'
>>> ed_user.password
'edspassword'
>>> str(ed_user.id)
'None'
與數(shù)據(jù)庫(kù)會(huì)話(huà):
當(dāng)我們首次啟動(dòng)應(yīng)用程序時(shí)尉姨,與我們的create_engine()語(yǔ)句相同庵朝,我們定義一個(gè)Session類(lèi),作為新的Session對(duì)象:
>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)
添加和更新對(duì)象:
要保留我們的User對(duì)象又厉,我們add()到我們的Session:
>>> ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
>>> session.add(ed_user)
我們可以使用add_all()一次添加更多User:
>>> session.add_all([
... User(name='wendy', fullname='Wendy Williams', password='foobar'),
... User(name='mary', fullname='Mary Contrary', password='xxg527'),
... User(name='fred', fullname='Fred Flinstone', password='blah')])
查詢(xún)操作:
>>> our_user = session.query(User).filter_by(name='ed').first()
修改數(shù)據(jù):
>>> ed_user.password = 'f8s7ccs'
此時(shí),數(shù)據(jù)庫(kù)實(shí)際并未被改變,需要進(jìn)一步做提交操作:
>>> session.commit()
commit()刷新數(shù)據(jù)庫(kù)中剩余的任何更改九府,并提交事務(wù)