# 數(shù)據(jù)庫表是一個二維表, 包含多行多列. 把一個表的內(nèi)容用pyton的數(shù)據(jù)接口表示的話, 可以用list表示多行
# list的每一個元素是tuple, 表示一個記錄.比如id 和name的user表
# [
# ('1', 'Michael'),
# ('2', 'Bob'),
# ('3', 'Adam')
# ]
# Python的DB-API返回的數(shù)據(jù)接口就是像上面這樣.
# 但是用tuple表示一行很難看出表的結(jié)構(gòu).如果把一個tuple用class實例表示, 就可以更容易看出表的結(jié)構(gòu)
# class User(object):
# def __init__(self, id, name):
# self.id = id
# self.name = name
# 這就是傳說中的ORM技術(shù): Object-Relational Mapping, 把關(guān)系數(shù)據(jù)庫的表結(jié)構(gòu)映射到對象上.
# 但是由誰來做這個轉(zhuǎn)換呢, 所以O(shè)RM框架應(yīng)運而生.
# 在Python中, 最有名的ORM框架是SQLAlchemy. 我們來看看SQLAlchemy的用法.
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
# 表的名字
__tablename__ = 'user'
# 表的結(jié)構(gòu)
id = Column(String(20), primary_key=True)
name = Column(String(20))
# 初始化數(shù)據(jù)庫連接
engine = create_engine('mysql+mysqlconnector://root:111111@localhost:3306/test')
# 創(chuàng)建DBSession類型
DBSession = sessionmaker(bind=engine)
# create_engine用來初始化數(shù)據(jù)庫連接.
# SQLAlchemy用一個字符串表示連接信息'數(shù)據(jù)庫類型+數(shù)據(jù)庫驅(qū)動名稱://用戶名:口令@機(jī)器地址:端口號/數(shù)據(jù)庫名'
# # 創(chuàng)建session對象:
# session = DBSession()
# # 創(chuàng)建新User對象
# new_user = User(id='5', name='Bob')
# # 添加到session
# session.add(new_user)
# # 提交保存到數(shù)據(jù)庫
# session.commit()
# # 關(guān)閉session
# session.close()
# 可見將關(guān)鍵是獲取session, 然后把對象添加到session, 最后提交并關(guān)閉.(DBSession對象, 可以看做是當(dāng)前數(shù)據(jù)庫的連接)
# 查詢
session = DBSession()
# 創(chuàng)建Query查詢, filter是where條件, 最后調(diào)用one()返回唯一行, 如果調(diào)用all()則返回所有行.
user = session.query(User).filter(User.id=='5').one()
print('type:', type(user))
print('name:', user.name)
session.close()
# ORM就是把數(shù)據(jù)庫表的行與相應(yīng)的對象簡歷關(guān)聯(lián), 互相轉(zhuǎn)換.
# 由于關(guān)系數(shù)據(jù)庫的多個表還可以用外鍵實現(xiàn)一對多, 多對多的關(guān)聯(lián), 相應(yīng)地, ORM框架也可以提供兩個對象之間的一對多, 多對多功能.
# 例如, 如果一個User擁有多個Book, 就可以定義一對多關(guān)系如下
# 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)
# nam = Column(String(20))
# user_id = Column(String(20), ForeignKey('user.id'))
Python--ORM框架
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門爱态,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谭贪,“玉大人,你說我怎么就攤上這事肢藐」屎樱” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵吆豹,是天一觀的道長鱼的。 經(jīng)常有香客問我,道長痘煤,這世上最難降的妖魔是什么凑阶? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮衷快,結(jié)果婚禮上宙橱,老公的妹妹穿的比我還像新娘。我一直安慰自己蘸拔,他們只是感情好师郑,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著调窍,像睡著了一般宝冕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上邓萨,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纸泄!你這毒婦竟也來了雅镊?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布摄闸,位于F島的核電站善镰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏年枕。R本人自食惡果不足惜炫欺,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望熏兄。 院中可真熱鬧品洛,春花似錦、人聲如沸摩桶。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽硝清。三九已至辅斟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耍缴,已是汗流浹背砾肺。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 廢話少說 之前自己主要是做web前端的他嫡,web后臺接觸的很少番官,最近在學(xué)習(xí)廖大的python教程,課程最后有一個小項...
- import threadingdef fun_timer():print('hello Timer!')glob...
- 故事的開始钢属,我買了一把傘 本來是黑色徘熔,遮陽,防曬 誰知店主安利附體 強(qiáng)推入手另外一把 外黑內(nèi)紅搭配各種大花 什么紅...