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。relationship()会使用两个表的外键约束来判定这种链接的性质。backref提供一种反向的查询。Student通过 Student.my_classes反向查询到StudyRecord。

最新文章

  1. [板子]ISAP
  2. SSRS 2008 R2 错误:Timeout expired. The timeout period
  3. 关于中文字体的设置说明(font:12px/1.5 tahoma,arial,\5b8b\4f53)
  4. 10、WGET
  5. Cron和Spring定时任务
  6. tornado 实践 - 目录结构
  7. CKEditor配置及使用
  8. 关于DatePicker控件在IsEnabled为False视觉效果没有明显辨识度的处理方法
  9. 【转载】详细解读C#中的 .NET 弱事件模式
  10. 初涉JavaScript模式 (7) : 原型模式 【三】
  11. MySQL数据库恢复(使用mysqlbinlog命令)
  12. 使用Java模拟一个简单的Dos学生成绩管理系统:
  13. android狼人杀源码,桌面源码,猎豹快切源码
  14. 【面试笔试算法】Program 5 : 推箱子 (网易游戏笔试题)
  15. 【原创】运维基础之keepalived
  16. js获取网页面的高度和宽度
  17. 整型 布尔值 字符串 for循环
  18. 第四章: 4.1 logging模块 | 正则表达式
  19. java中堆与栈的区别
  20. IntelIJ IDEA配置Tomcat遇到问题Error during artifact deployment. See server log for details

热门文章

  1. Jquery 在ios上事件委托失效
  2. PIE SDK Command&amp;&amp;Tool工具命令一览表
  3. 使用Appium-Desktop捕获APP元素控件实现自动化控制
  4. python3 zip压缩
  5. 转帖 利用伪元素和css3实现鼠标移入下划线向两边展开效果
  6. Python - 购物车代码 (账户登陆,用户个人清单存取,重要信息高亮显示)
  7. Json 装 list&lt;object&gt;objectList
  8. C++中函数调用时的三种参数传递方式
  9. 009-MailUtils工具类模板
  10. CentOS7 配置免密登陆