python SQLAchemy外键关联
2024-09-04 14:23:34
join
1、利用filter
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String from sqlalchemy.orm import sessionmaker
from sqlalchemy import func
# 连接方式 mysql+pymysql 用户名 root 密码 123456 主机 localhost 库 testdb encoding 字符集
engine = create_engine("mysql+pymysql://root:123456@localhost/testdb",encoding='utf-8', echo=True) Base = declarative_base() # 生成orm基类 class User(Base):
__tablename__ = 'user' # 表名
id = Column(Integer, primary_key=True)
name = Column(String(32))
password = Column(String(64)) def __repr__(self):
return "<%s name:%s>" % (self.id,self.name) class Student(Base):
__tablename__ = 'student' # 表名
id = Column(Integer,primary_key=True)
name = Column(String(32),nullable=False)
register_data = Column(DATE,nullable=False)
gender=Column(String(32),nullable=False) def __repr__(self):
return "<%s name:%s>" % (self.id,self.name) Base.metadata.create_all(engine) # 创建表结构 Session_class = sessionmaker(bind=engine) # 创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
Session = Session_class() # 生成session实例 cursor
print(Session.query(User,Student).filter(User.id==Student.id).all())
2 、join
这个要求A表和B表必须有FOREIGN KEY的关系才可以。
Session.query(User).join(Student).all()
Session.query(User).join(Student,isouter=True).all()
ORM实现外键约束
用户表、课程表、用户与课程中间表
1、首先把用户和用户中间表管理起来
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String,ForeignKey,DATE
from sqlalchemy.orm import sessionmaker
from sqlalchemy import func
# 连接方式 mysql+pymysql 用户名 root 密码 123456 主机 localhost 库 testdb encoding 字符集
engine = create_engine("mysql+pymysql://root:@localhost/test",encoding='utf-8', echo=True) Base = declarative_base() # 生成orm基类 class Student(Base):
__tablename__='student'
id = Column(Integer,primary_key=True)
name=Column(String(32),nullable=False)
register_date=Column(DATE,nullable=False) def __repr__(self):
return "<%s name:%s>" % (self.id,self.name) class StudyRecord(Base):
__tablename__='study_record'
id = Column(Integer,primary_key=True)
day = Column(Integer,nullable=False)
status = Column(String(32),nullable=False)
stu_id = Column(Integer,ForeignKey('student.id')) def __repr__(self):
return "<%s name:%s>" % (self.id,self.day) Base.metadata.create_all(engine) # 创建表结构
以上先创建两张表
2、添加学员
Session_class = sessionmaker(bind=engine)
Session = Session_class() # 生成session实例 cursor s1 = Student(name='Alex',register_date='2017-10-24')
s2 = Student(name='jack',register_date='2017-10-24')
s3 = Student(name='rain',register_date='2017-10-24')
s4 = Student(name='Lily',register_date='2017-10-24')
s5 = Student(name='Lucy',register_date='2017-10-24') study_obj1 = StudyRecord(day=1,status='yes',stu_id=1)
study_obj2 = StudyRecord(day=2,status='yes',stu_id=1)
study_obj3 = StudyRecord(day=3,status='yes',stu_id=1)
study_obj4 = StudyRecord(day=1,status='yes',stu_id=2)
study_obj5 = StudyRecord(day=2,status='yes',stu_id=2) Session.add_all([s1,s2,s3,s4,s5,study_obj1,study_obj2,study_obj3,study_obj4,study_obj5]) Session.commit() # 现此才统一提交,创建数据
3、 查询
先看一个比较牛的东西:反查。通过设置的一个字段反向查询关联的表。关联表也可以根据这个字段查询当前表。双向反查。
class StudyRecord(Base):
__tablename__='study_record'
id = Column(Integer,primary_key=True)
day = Column(Integer,nullable=False)
status = Column(String(32),nullable=False)
stu_id = Column(Integer,ForeignKey('student.id'))
student = relationship('Student',backref='my_classes') #指定关联的表 Student, backref
def __repr__(self):
return "<%s day:%s status:%s>" % (self.student.name,self.day,self.status)
Base.metadata.create_all(engine) # 创建表结构 Session_class = sessionmaker(bind=engine)
Session = Session_class() # 生成session实例 cursor
Stu_obj = Session.query(Student).filter(Student.name=='alex').first()
print(Stu_obj.my_classes)
首先 stu_id为ForeignKey,
relationship()
函数将告知ORM通过StudyRecord.student 关联到类Student。
会使用两个表的外键约束来判定这种链接的性质。backref提供一种反向的查询。relationship()
Student通过
.my_classes反向查询到StudyRecord。 Student
最新文章
- [板子]ISAP
- SSRS 2008 R2 错误:Timeout expired. The timeout period
- 关于中文字体的设置说明(font:12px/1.5 tahoma,arial,\5b8b\4f53)
- 10、WGET
- Cron和Spring定时任务
- tornado 实践 - 目录结构
- CKEditor配置及使用
- 关于DatePicker控件在IsEnabled为False视觉效果没有明显辨识度的处理方法
- 【转载】详细解读C#中的 .NET 弱事件模式
- 初涉JavaScript模式 (7) : 原型模式 【三】
- MySQL数据库恢复(使用mysqlbinlog命令)
- 使用Java模拟一个简单的Dos学生成绩管理系统:
- android狼人杀源码,桌面源码,猎豹快切源码
- 【面试笔试算法】Program 5 : 推箱子 (网易游戏笔试题)
- 【原创】运维基础之keepalived
- js获取网页面的高度和宽度
- 整型 布尔值 字符串 for循环
- 第四章: 4.1 logging模块 | 正则表达式
- java中堆与栈的区别
- IntelIJ IDEA配置Tomcat遇到问题Error during artifact deployment. See server log for details
热门文章
- Jquery 在ios上事件委托失效
- PIE SDK Command&;&;Tool工具命令一览表
- 使用Appium-Desktop捕获APP元素控件实现自动化控制
- python3 zip压缩
- 转帖 利用伪元素和css3实现鼠标移入下划线向两边展开效果
- Python - 购物车代码 (账户登陆,用户个人清单存取,重要信息高亮显示)
- Json 装 list<;object>;objectList
- C++中函数调用时的三种参数传递方式
- 009-MailUtils工具类模板
- CentOS7 配置免密登陆