SQLAlchemy | 您所在的位置:網(wǎng)站首頁(yè) › 屬龍的媽媽生虎寶寶好不好呀女孩 › SQLAlchemy |
orm(object relational mapping)是對(duì)象映射關(guān)系程序,通過(guò)orm將編程語(yǔ)言的對(duì)象模型和數(shù)據(jù)庫(kù)的關(guān)系模型建立映射關(guān)系,這樣我們?cè)谑褂镁幊陶Z(yǔ)言對(duì)數(shù)據(jù)庫(kù)進(jìn)行作的時(shí)候可以直接使用編程語(yǔ)言的對(duì)象模型進(jìn)行作就可以了,而不用直接使用sql語(yǔ)言。 在Python中,最有名的ORM框架是SQLAlchemy。 創(chuàng)建表models.py from sqlalchemy import Table, Column, Integer, String, DATE, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import create_engine # 輸入用戶名、密碼連接數(shù)據(jù)庫(kù) engine = create_engine("mysql+pymysql://root:[email protected]/stu_manege", encoding='utf-8', echo=False) # 生成ORM基類 Base = declarative_base() # 用于多對(duì)多關(guān)聯(lián) class_m2m_stu = Table('class_m2m_stu', Base.metadata, Column('class_id', Integer, ForeignKey('classes.class_id')), Column('stu_id', Integer, ForeignKey('students.stu_id')), ) class Class(Base): __tablename__ = 'classes' # 表名 class_id = Column(Integer, primary_key=True, autoincrement=True) class_name = Column(String(64), nullable=False) class_method = Column(String(64)) student = relationship('Student', secondary=class_m2m_stu, backref='my_class') # 通過(guò)my_class可以連接到Class類,通過(guò)student可以連接到Student類 def __repr__(self): return self.class_name # 返回Class類對(duì)象時(shí),顯示class_name class Student(Base): __tablename__ = 'students' stu_id = Column(Integer, primary_key=True) stu_name = Column(String(32), nullable=False) def __repr__(self): return self.stu_name Base.metadata.create_all(engine) # 創(chuàng)建表結(jié)構(gòu) 插入數(shù)據(jù) from sqlalchemy.orm import sessionmaker import models Session_class = sessionmaker(bind=models.engine) # 創(chuàng)建與數(shù)據(jù)庫(kù)的會(huì)話session class ,注意,這里返回給session的是個(gè)class,不是實(shí)例 session = Session_class() # 生成session實(shí)例 stu1 = models.Student(stu_id=100000001, stu_name='tom') stu2 = models.Student(stu_id=100000002, stu_name='jerry') cla1 = models.Class(class_name='python第一期', class_method='python') cla2 = models.Class(class_name='python第二期', class_method='python') # 添加關(guān)聯(lián)對(duì)象 cla1.student = [stu1, stu2] cla2.student = [stu1] # class_m2m_stu表會(huì)自動(dòng)創(chuàng)建多條記錄連接classes和students表 session.add_all([stu1, stu2, cla1, cla2]) # 將要?jiǎng)?chuàng)建的數(shù)據(jù)對(duì)象添加到session中 session.commit() # 提交 查詢數(shù)據(jù) import models from sqlalchemy.orm import sessionmaker Session_class = sessionmaker(bind=models.engine) session = Session_class() # 獲取students表中 stu_id == user_id 的數(shù)據(jù)(對(duì)象),通過(guò)stu.my_class就可以獲取與stu對(duì)象關(guān)聯(lián)的Class類信息 stu = session.query(models.Student).filter(models.Student.stu_id == user_id).first() # 獲取students表中 stu_id > id 的所有數(shù)據(jù)(對(duì)象列表) stu = session.query(models.Student).filter(models.Student.stu_id > id).all() # 多條件查詢、獲取students表中 min_id < stu_id < max_id 的所有數(shù)據(jù)(對(duì)象列表) stu = session.query(models.Student).filter(models.Student.stu_id > min_id).filter(models.Student.stu_id < max_id).all() 修改數(shù)據(jù) import models from sqlalchemy.orm import sessionmaker Session_class = sessionmaker(bind=models.engine) session = Session_class() # 先查詢數(shù)據(jù) stu = session.query(models.Student).filter(models.Student.stu_id == user_id).first() # 直接修改 stu.stu_name = 'new_name' # 提交 session.commit() 回滾在session.commit()前進(jìn)行session.rollback()可以撤銷之前的作 使用session.add()添加數(shù)據(jù)后,數(shù)據(jù)會(huì)儲(chǔ)存在session中,這時(shí)session.rollback()可以清除之前添加的數(shù)據(jù)。 統(tǒng)計(jì)和分組 # 統(tǒng)計(jì)students表中姓名以't'開(kāi)頭的學(xué)生數(shù)量 session.query(models.Student).filter(models.Student.name.like("t%")).count() # 以學(xué)生姓名分組,并計(jì)數(shù) from sqlalchemy import func print(session.query(func.count(Student.stu_name),Student.stu_name).group_by(Student.stu_name).all() ) 外鍵只需建表時(shí),在相關(guān)數(shù)據(jù)列聲明stu_id = Column(Integer, ForeignKey('Student.stu_id')) 多對(duì)一當(dāng)一張表中有多個(gè)字段都關(guān)聯(lián)了一張表時(shí),如果這些字段relationship一樣就分不清了: billing_address = relationship("Address") shipping_address = relationship("Address")所以需要聲明關(guān)聯(lián)的外鍵: billing_address = relationship("Address", foreign_keys=[billing_address_id]) shipping_address = relationship("Address", foreign_keys=[shipping_address_id])這樣就可以分清了 多對(duì)多多對(duì)多的關(guān)系只需再引入一張表就可以表示,建表時(shí)需要額外建一張表: class_m2m_stu = Table('class_m2m_stu', Base.metadata, Column('class_id', Integer, ForeignKey('classes.class_id')), Column('stu_id', Integer, ForeignKey('students.stu_id')), )插入數(shù)據(jù)時(shí)不用管這張表,只需這樣表示就會(huì)把兩張表連接起來(lái) cla1.student = [stu1, stu2] cla2.student = [stu1]當(dāng)刪除數(shù)據(jù)時(shí)也不用管這張表,里面的關(guān)聯(lián)關(guān)系數(shù)據(jù)會(huì)自動(dòng)刪除 |
CopyRight 2018-2019 實(shí)驗(yàn)室設(shè)備網(wǎng) 版權(quán)所有 |