数据库中一般采用主键,外键关系约束2表之间的关系。在插入删除时候进行约束。
在检索数据时候,为了简化操作,sqlalchemy 在外键基础上,采用了relationship。可通过一个表对象获取另一个表中数据,很方便。
下面通过代码介绍
-
# coding=utf-8
-
-
from sqlalchemy import create_engine
-
-
-
from sqlalchemy.ext.declarative import declarative_base
-
from sqlalchemy.orm import sessionmaker
-
from sqlalchemy import Column, String, SmallInteger, Integer, DateTime, text, JSON, ForeignKey,or_, and_, func, extract, desc
-
-
from sqlalchemy.orm import relationship # 创建关系
-
-
# 创建session
-
engine = create_engine("mysql+mysqlconnector://root:123456@127.0.0.1/testdb") #testdb为数据库名
-
DbSession = sessionmaker(bind=engine)
-
session = DbSession()
-
-
-
Base = declarative_base() # 生成orm基类
-
class Student(Base):
-
__tablename__ = "test_student"
-
-
id = Column(Integer, primary_key=True)
-
name = Column(String(64), unique=True)
-
myscore = relationship("Score", back_populates="student") #声明relationship,注意myscore不是字段,是关系,不能用于字段检索。是在query后,对应1条记录的对象中存在
-
-
-
class Score(Base):
-
__tablename__ = "test_score"
-
-
id = Column(Integer, primary_key=True)
-
student_id = Column(Integer, ForeignKey("test_student.id"))
-
class_score = Column(Integer, default=0)
-
#student = relationship("Student",backref="myscore")
-
student = relationship("Student", back_populates="myscore")
-
-
#创建表
-
Base.metadata.create_all(engine)
-
-
-
_query = session.query(Score).filter(Score.id == 2).first()
-
print(_query.student.name) #通过Score 取得student数据
-
print(_query.student.myscore)
-
通过在记录对象中加入这个属性
(relationship返回的),比如
Score模型中的student,可以方便读取和修改(append set操作),若存在一对多关系,则该属性就是个数组。很方便操作。
注意 采用back_populates方式 2边要同时声明;若是backref方式则在一个边即可。但现在用back_populates更多
详细使用参考官网:
阅读(3745) | 评论(0) | 转发(0) |