Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7263539
  • 博文数量: 512
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6857
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(512)

文章存档

2024年(2)

2022年(2)

2021年(6)

2020年(59)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类: Python/Ruby

2020-11-19 10:47:14

数据库中一般采用主键,外键关系约束2表之间的关系。在插入删除时候进行约束。
在检索数据时候,为了简化操作,sqlalchemy 在外键基础上,采用了relationship。可通过一个表对象获取另一个表中数据,很方便。
下面通过代码介绍

点击(此处)折叠或打开

  1. # coding=utf-8

  2. from sqlalchemy import create_engine


  3. from sqlalchemy.ext.declarative import declarative_base
  4. from sqlalchemy.orm import sessionmaker
  5. from sqlalchemy import Column, String, SmallInteger, Integer, DateTime, text, JSON, ForeignKey,or_, and_, func, extract, desc

  6. from sqlalchemy.orm import relationship # 创建关系

  7. # 创建session
  8. engine = create_engine("mysql+mysqlconnector://root:123456@127.0.0.1/testdb") #testdb为数据库名
  9. DbSession = sessionmaker(bind=engine)
  10. session = DbSession()


  11. Base = declarative_base() # 生成orm基类
  12. class Student(Base):
  13.     __tablename__ = "test_student"

  14.     id = Column(Integer, primary_key=True)
  15.     name = Column(String(64), unique=True)
  16.     myscore = relationship("Score", back_populates="student") #声明relationship,注意myscore不是字段,是关系,不能用于字段检索。是在query后,对应1条记录的对象中存在


  17. class Score(Base):
  18.     __tablename__ = "test_score"

  19.     id = Column(Integer, primary_key=True)
  20.     student_id = Column(Integer, ForeignKey("test_student.id"))
  21.     class_score = Column(Integer, default=0)
  22.     #student = relationship("Student",backref="myscore")
  23.     student = relationship("Student", back_populates="myscore")

  24. #创建表
  25. Base.metadata.create_all(engine)


  26. _query = session.query(Score).filter(Score.id == 2).first()
  27. print(_query.student.name) #通过Score 取得student数据
  28. print(_query.student.myscore)


通过在记录对象中加入这个属性relationship返回的,比如Score模型中的student,可以方便读取和修改(append set操作),若存在一对多关系,则该属性就是个数组。很方便操作。

注意 采用back_populates方式 2边要同时声明;若是backref方式则在一个边即可。但现在用back_populates更多

详细使用参考官网:
阅读(3745) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~