一、创建两张表,并关联外键

  导入ForenginKey模块  

# -*- coding: UTF-8 -*-
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, DATE, Enum
from sqlalchemy import ForeignKey
from sqlalchemy.orm import sessionmaker engine = create_engine("mysql+pymysql://bigberg:111111@172.16.200.49:3306/study",
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)
gender = Column(Enum('F', 'M'), nullable=False) def __repr__(self):
return "id:%s name:%s register_date:%s gender:%s" \
%(self.id,self.name, self.register_date, self.gender) class Score(Base):
__tablename__ = "score"
id = Column(Integer, primary_key=True)
day = Column(Integer, nullable=False)
name = Column(String(32), nullable=False)
score = Column(Integer, nullable=False)
stu_id = Column(Integer, ForeignKey("student.id")) def __repr__(self):
return "id:%s day:%s name:%s score:%s stu_id:%s" \
%(self.id, self.day, self.name, self.score, self.stu_id) # 创建表
Base.metadata.create_all(engine)

创建表

mysql> desc student;
+---------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(32) | NO | | NULL | |
| register_date | date | NO | | NULL | |
| gender | enum('F','M') | NO | | NULL | |
+---------------+---------------+------+-----+---------+----------------+
4 rows in set (0.00 sec) mysql> desc score;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| day | int(11) | NO | | NULL | |
| name | varchar(32) | NO | | NULL | |
| score | int(11) | NO | | NULL | |
| stu_id | int(11) | YES | MUL | NULL | |
+--------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

表结构

二、插入数据

# 创建session会话
Session_class = sessionmaker(bind=engine)
# 生成session实例
session = Session_class() # 创建数据
s1 = Student(name="zhangsan", register_date="2018-01-01", gender='M')
s2 = Student(name="lisi", register_date="2018-01-02", gender='F')
s3 = Student(name="wangwu", register_date="2018-02-04", gender='F')
s4 = Student(name="zhaoliu", register_date="2018-03-05", gender='M') score1 = Score(day=1, name='zhangsan', score=90, stu_id=1)
score2 = Score(day=2, name='zhangsan', score=70, stu_id=1)
score3 = Score(day=3, name='zhangsan', score=84, stu_id=1)
score4 = Score(day=1, name='lisi', score=90, stu_id=2)
score5 = Score(day=1, name='wangwu', score=87, stu_id=3) session.add_all([s1,s2,s3,s4,score1,score2,score3,score4,score5])
session.commit()

插入数据

mysql> select * from student;
+----+----------+---------------+--------+
| id | name | register_date | gender |
+----+----------+---------------+--------+
| 1 | zhangsan | 2018-01-01 | M |
| 2 | lisi | 2018-01-02 | F |
| 3 | wangwu | 2018-02-04 | F |
| 4 | zhaoliu | 2018-03-05 | M |
+----+----------+---------------+--------+
4 rows in set (0.00 sec) mysql> select * from score;
+----+-----+----------+-------+--------+
| id | day | name | score | stu_id |
+----+-----+----------+-------+--------+
| 1 | 1 | zhangsan | 90 | 1 |
| 2 | 2 | zhangsan | 70 | 1 |
| 3 | 3 | zhangsan | 84 | 1 |
| 4 | 1 | lisi | 90 | 2 |
| 5 | 1 | wangwu | 87 | 3 |
+----+-----+----------+-------+--------+
5 rows in set (0.00 sec)

数据内容

三、relationship

3.1 生成的对象调用

  外键关联是mysql数据库中确确实实存在的外键,而relationship是类和类之间的关联,是两个类之间实现相互之间的调用。

  导入relationship模块

  修改一个Score类的代码,增加一个relationship

class Score(Base):
__tablename__ = "score"
id = Column(Integer, primary_key=True)
day = Column(Integer, nullable=False)
name = Column(String(32), nullable=False)
score = Column(Integer, nullable=False)
stu_id = Column(Integer, ForeignKey("student.id")) student = relationship("Student", backref="my_score")
# 这个关系允许在score表中使用studnet 来显示 表studnet中所有内容
# 在表student中使用my_score来显示 score表中所有内容
# 这个relationship 是orm自己的东西,和mysql无关,是类之间的调用
def __repr__(self):
return "id:%s day:%s name:%s score:%s stu_id:%s" \
%(self.id, self.day, self.name, self.score, self.stu_id)

  查询使用:

stu_obj = session.query(Student).filter(Student.name=='zhangsan').first()
print(stu_obj.my_score)
stu_obj2 = session.query(Score).filter(Score.name=='zhangsan').all()
print(stu_obj2) session.commit() # 输出
[id:1 day:1 name:zhangsan score:90 stu_id:1, id:2 day:2 name:zhangsan score:70 stu_id:1, id:3 day:3 name:zhangsan score:84 stu_id:1]
[id:1 day:1 name:zhangsan score:90 stu_id:1, id:2 day:2 name:zhangsan score:70 stu_id:1, id:3 day:3 name:zhangsan score:84 stu_id:1] # 可以看到他们的结果是一样的
# 但是第一个stu_obj通过studnet 调用 my_score实现了调用 score表中的内容

  

3.2 类中之间调用

class Score(Base):
__tablename__ = "score"
id = Column(Integer, primary_key=True)
day = Column(Integer, nullable=False)
name = Column(String(32), nullable=False)
score = Column(Integer, nullable=False)
stu_id = Column(Integer, ForeignKey("student.id")) student = relationship("Student", backref="my_score")
# 这个关系允许在score表中使用studnet 来显示 表studnet中所有内容
# 在表student中使用my_score来显示 score表中所有内容
# 这个relationship 是orm自己的东西,和mysql无关,是类之间的调用
def __repr__(self):
return "id:%s day:%s register_date:%s score:%s stu_id:%s" \
%(self.id, self.day, self.student.register_date, self.score, self.stu_id) # 直接在Score类中调用 self.student.register_date

  

stu_obj = session.query(Student).filter(Student.name=='zhangsan').first()
print(stu_obj.my_score)
stu_obj2 = session.query(Score).filter(Score.name=='zhangsan').all()
print(stu_obj2) session.commit() #输出
[id:1 day:1 register_date:2018-01-01 score:90 stu_id:1, id:2 day:2 register_date:2018-01-01 score:70 stu_id:1, id:3 day:3 register_date:2018-01-01 score:84 stu_id:1]
[id:1 day:1 register_date:2018-01-01 score:90 stu_id:1, id:2 day:2 register_date:2018-01-01 score:70 stu_id:1, id:3 day:3 register_date:2018-01-01 score:84 stu_id:1]

  

sqlalchemy外键关联的更多相关文章

  1. pythonのsqlalchemy外键关联查询

    #!/usr/bin/env python import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.dec ...

  2. Python sqlalchemy orm 外键关联

    创建外键关联 并通过relationship 互相调用 如图: 实现代码: import sqlalchemy # 调用链接数据库 from sqlalchemy import create_engi ...

  3. Python sqlalchemy orm 多外键关联

     多外键关联 注:在两个表之间进行多外键链接 如图: 案例: # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, For ...

  4. Python sqlalchemy orm 多对多外键关联

    多对多外键关联 注:使用三张表进行对应关联 实现代码: # 创建3个表 配置外键关联 # 调用Column创建字段 加类型 from sqlalchemy import Table, Column, ...

  5. sqlalchemy多外键关联

    一.前言 如果有张表A的多个字段关联另一张表B的一个字段,就如同一个客户表的账单地址和发货地址,同时关联地址表中的id字段. 二.事例 # -*- coding: UTF-8 -*- from sql ...

  6. sqlalchemy外键的一些东西

    sqlalchemy中让MySQL支持中文字符 engine = create_engine("mysql+pymysql://root:mysql8@localhost/mysqltest ...

  7. sqlalchemy外键和relationship查询

    前面的文章中讲解了外键的基础知识和操作,上一篇文章讲解了sqlalchemy的基本操作.前面两篇文章都是作为铺垫,为下面的文章打好基础.记得初一时第一次期中考试时考的不好,老爸安慰我说:“学习是一个循 ...

  8. 吃货眼中的sqlalchemy外键和连表查询

    前言 使用数据库一个高效的操作是连表查询,一条查询语句能够查询到多个表的数据.在sqlalchem架构下的数据库连表查询更是十分方便.那么如何连表查询?以及数据库外键对连表查询有没有帮助呢?本篇文章就 ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (29) ------ 第五章 加载实体和导航属性之过滤预先加载的实体集合和修改外键关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-13  过滤预先加载的实体集合 问题 你想过滤预先加载的实体集合,另外,你想使用 ...

随机推荐

  1. Thunder——Final发布

    视频: https://www.bilibili.com/video/av17008792/   视频播放截图及简要文字介绍: http://www.cnblogs.com/lick468/p/799 ...

  2. 学习Mybatis的两个必须的jar包分享

    百度云盘:http://pan.baidu.com/s/1nuNxRcd 提取码:t765(好像不需要提取码,不太会用云盘...) 自己学习mybatis的时候去找这两个jar包也是不容易,特别分享一 ...

  3. No.1100_第九次团队会议

    在今天项目有了新的突破,大家的情绪明显高涨了一些,一改往日的颓丧.但是仍然还有很多功能没有完善,于是大家相互交流了一下自己的进度,列出还没有完善的部分,有些困难的部分一时解决不了,我们决定多人合作来解 ...

  4. Alpha阶段项目Postmortem会议总结

    (一)设想和目标 1.我们的软件要解决什么问题?是否定义的很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要解决总是不知道在什么时间该做什么事情,或是老是忘记做一些事情的问题,通过添加事件 ...

  5. angularJS1笔记-(8)-内置指令

    index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  6. SDWebImage缓存图片的机制

    SDWebImage是一个很厉害的图片缓存的框架.既ASIHttp+AsyncImage之后,我一直使用AFNetworking集成的UIImageView+AFNetworking.h,但后者对于图 ...

  7. 深入理解JAVA I/O系列二:字节流详解

    流的概念 JAVA程序通过流来完成输入/输出.流是生产或消费信息的抽象,流通过JAVA的输入输出与物理设备链接,尽管与它们链接的物理设备不尽相同,所有流的行为具有相同的方式.这样就意味一个输入流能够抽 ...

  8. HDU 2107 Founding of HDU

    http://acm.hdu.edu.cn/showproblem.php?pid=2107 Problem Description 经过慎重的考虑,XHD,8600, LL,Linle以及RPG等A ...

  9. js+Canvas 利用js 实现浏览器保存图片到本地

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. web安全测试系统

    最近写了个简单的web安全实践系统部署到了docker中 下载方式:docker pull ju5ton1y/websecurity github Dockerfile下载地址:https://git ...