SQLAlchem(三)

知識(shí)要點(diǎn):表關(guān)系的實(shí)現(xiàn)

1.代碼復(fù)用喘鸟。

在我們用sqlalchemy操作數(shù)據(jù)庫時(shí)服赎,有部分代碼可以重復(fù)使用媒殉,我們將這部分放到一個(gè)模塊中迁客,后面使用就可以調(diào)用這個(gè)模塊郭宝,導(dǎo)入里面的方法。

# 1.連接數(shù)據(jù)庫
from sqlalchemy import  create_engine

HOSTNAME = '127.0.0.1'  # ip地址
PORT = '3306'  # 端口號(hào)
DATABASE = 'mysqldb'  # 數(shù)據(jù)庫名
USERNAME = 'root'  # 用戶名
PASSWORD = 'password'  # 用戶登錄密碼
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
engine = create_engine(DB_URI)

# 2. 聲明映像
from sqlalchemy.ext.declarative import  declarative_base
Base = declarative_base(engine)



# 5.創(chuàng)建會(huì)話
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)
session = Session()

2.一對(duì)多表關(guān)系的實(shí)現(xiàn)

我們?cè)谥vmysql的時(shí)候?qū)W院與學(xué)生的關(guān)系是一對(duì)多關(guān)系掷漱,下面是通過SQLAlchemy來表示這種關(guān)系粘室。

from connect import Base,session
from sqlalchemy import  Column,Integer,String,ForeignKey
from sqlalchemy.orm import relationship

class Department(Base):
    __tablename__ = 'department'
    d_id = Column(Integer,primary_key=True,autoincrement=True)
    d_name = Column(String(100))

    student = relationship('Student',backref='department')
    def __repr__(self):
        return '<Department(d_id="%s",d_name="%s")>' % (self.d_id, self.d_name)

class Student(Base):
    __tablename__ = 'student'

    s_id = Column(Integer,primary_key=True,autoincrement=True)
    s_name = Column(String(50))
    d_id = Column(Integer,ForeignKey('department.d_id'))

    def __repr__(self):
        return '<Student(s_id="%s",s_name="%s",d_id="%s")>' % (self.s_id, self.s_name, self.d_id)

Base.metadata.create_all()

講relationship之前,先回顧一下卜范,外鍵它是一個(gè)約束衔统,但是并不是代表了關(guān)系,之前所講的一對(duì)多海雪,一對(duì)一和多對(duì)多關(guān)系都是在我們的邏輯上锦爵,外鍵約束不能代表這種關(guān)系,注意分清外鍵是約束奥裸,沒有代表關(guān)系险掀。

而在SQLAlchemy里面,這個(gè)relationship代表了一對(duì)多的關(guān)系刺彩,當(dāng)然我們可以通過參數(shù)改變關(guān)系迷郑,它默認(rèn)是一對(duì)多的關(guān)系,而這個(gè)關(guān)系是SQLAlchemy里面的创倔,和數(shù)據(jù)庫沒有關(guān)系,但是relationship是和外鍵一起使用的嗡害。

通過relationship在學(xué)院的類中增加了一個(gè)學(xué)生的屬性,在學(xué)生的類中增加學(xué)生的屬性畦攘。這樣我們就可以通過這個(gè)屬性查出某個(gè)學(xué)院的所有的學(xué)生的列表霸妹,也可以查出某個(gè)學(xué)生的所屬學(xué)院,還可以通過學(xué)院的學(xué)生列表往這個(gè)學(xué)院中添加學(xué)員知押。

3.一對(duì)一表關(guān)系實(shí)現(xiàn)

我們?cè)谥vmysql的時(shí)候?qū)W生表與學(xué)生詳細(xì)信息表的關(guān)系是一對(duì)一關(guān)系叹螟,下面是通過SQLAlchemy來表示這種關(guān)系。

class Student(Base):
    __tablename__ = 'student'
    s_id = Column(Integer,primary_key=True,autoincrement=True)
    s_name = Column(String(50))
    d_id = Column(Integer,ForeignKey('department.d_id'))

    stu_details = relationship('Stu_details',uselist=False)
    def __repr__(self):
        return '<Student(s_id="%s",s_name="%s",d_id="%s")>' % (self.s_id, self.s_name, self.d_id)

class Stu_details(Base):
    __tablename__ = 'stu_details'
    id = Column(Integer,primary_key=True,autoincrement=True)
    age = Column(Integer)
    city = Column(String(100))
    s_id = Column(Integer,ForeignKey('student.s_id'),unique=True)

    student = relationship('Student')

在這里實(shí)現(xiàn)一對(duì)一關(guān)系和我們mysql中稍微的差別台盯,我們通過外鍵加唯一鍵實(shí)現(xiàn)mysql層面的一對(duì)一罢绽,通過relationship中的uselist=False實(shí)現(xiàn)python層面的表關(guān)系。

4.多對(duì)多關(guān)系的實(shí)現(xiàn)

我們?cè)谥vmysql的時(shí)候?qū)W生與課程的關(guān)系是多對(duì)多關(guān)系静盅,下面是通過SQLAlchemy來表示這種關(guān)系良价。

stu_course = Table('stu_course',Base.metadata,
    Column('s_id',Integer,ForeignKey('students.s_id'),primary_key=True),
    Column('c_id',Integer,ForeignKey('course.c_id'),primary_key=True)
    )
class Students(Base):
    __tablename__ = 'students'

    s_id = Column(Integer,primary_key=True)
    s_name = Column(String(100))

    course = relationship('Course',secondary=stu_course)

class Course(Base):
    __tablename__ = 'course'

    c_id = Column(Integer,primary_key=True)
    c_name = Column(String(100))

    students = relationship('Students',secondary=stu_course)

在多對(duì)多的關(guān)系中,我需要再建立一張表,通過這張表明垢,我們建立多對(duì)多的關(guān)系蚣常。使用relationship當(dāng)中secondary參數(shù)來獲取中間表,表示多對(duì)多關(guān)系痊银。

總結(jié)

在數(shù)據(jù)庫中外鍵只有約束的功能抵蚊,但是在SQLAlchemy中,relationship表示了關(guān)系溯革,但是這個(gè)關(guān)系只是在SQL Alchemy里面贞绳,和數(shù)據(jù)庫并沒有關(guān)系,在SQLALchemy里面鬓照,其實(shí)也是轉(zhuǎn)成SQL語句去做的熔酷,但是使用SQLAlchemy給我們提供的這個(gè)方法,可以讓我們寫跟少的SQL語言或者代碼豺裆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拒秘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子臭猜,更是在濱河造成了極大的恐慌躺酒,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔑歌,死亡現(xiàn)場(chǎng)離奇詭異羹应,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)次屠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門园匹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人劫灶,你說我怎么就攤上這事裸违。” “怎么了本昏?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵供汛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我涌穆,道長(zhǎng)怔昨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任宿稀,我火速辦了婚禮趁舀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祝沸。我一直安慰自己赫编,他們只是感情好巡蘸,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著擂送,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唯欣。 梳的紋絲不亂的頭發(fā)上嘹吨,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音境氢,去河邊找鬼蟀拷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛萍聊,可吹牛的內(nèi)容都是我干的问芬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼寿桨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼此衅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亭螟,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤挡鞍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后预烙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墨微,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年扁掸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翘县。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谴分,死狀恐怖锈麸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狸剃,我是刑警寧澤掐隐,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站钞馁,受9級(jí)特大地震影響虑省,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜僧凰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一探颈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧训措,春花似錦伪节、人聲如沸光羞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纱兑。三九已至,卻和暖如春化借,著一層夾襖步出監(jiān)牢的瞬間潜慎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工蓖康, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铐炫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓蒜焊,卻偏偏與公主長(zhǎng)得像倒信,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泳梆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容