sqlalchemy外键关联
一、创建两张表,并关联外键
导入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外键关联的更多相关文章
- pythonのsqlalchemy外键关联查询
#!/usr/bin/env python import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.dec ...
- Python sqlalchemy orm 外键关联
创建外键关联 并通过relationship 互相调用 如图: 实现代码: import sqlalchemy # 调用链接数据库 from sqlalchemy import create_engi ...
- Python sqlalchemy orm 多外键关联
多外键关联 注:在两个表之间进行多外键链接 如图: 案例: # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, For ...
- Python sqlalchemy orm 多对多外键关联
多对多外键关联 注:使用三张表进行对应关联 实现代码: # 创建3个表 配置外键关联 # 调用Column创建字段 加类型 from sqlalchemy import Table, Column, ...
- sqlalchemy多外键关联
一.前言 如果有张表A的多个字段关联另一张表B的一个字段,就如同一个客户表的账单地址和发货地址,同时关联地址表中的id字段. 二.事例 # -*- coding: UTF-8 -*- from sql ...
- sqlalchemy外键的一些东西
sqlalchemy中让MySQL支持中文字符 engine = create_engine("mysql+pymysql://root:mysql8@localhost/mysqltest ...
- sqlalchemy外键和relationship查询
前面的文章中讲解了外键的基础知识和操作,上一篇文章讲解了sqlalchemy的基本操作.前面两篇文章都是作为铺垫,为下面的文章打好基础.记得初一时第一次期中考试时考的不好,老爸安慰我说:“学习是一个循 ...
- 吃货眼中的sqlalchemy外键和连表查询
前言 使用数据库一个高效的操作是连表查询,一条查询语句能够查询到多个表的数据.在sqlalchem架构下的数据库连表查询更是十分方便.那么如何连表查询?以及数据库外键对连表查询有没有帮助呢?本篇文章就 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (29) ------ 第五章 加载实体和导航属性之过滤预先加载的实体集合和修改外键关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-13 过滤预先加载的实体集合 问题 你想过滤预先加载的实体集合,另外,你想使用 ...
随机推荐
- 团队博客作业Week4 --- 学霸网站--NABC
1.需求(Need) 伴随着经济的发展,科学技术取得了飞速的发展,互联网在各行各业的发展中取得了广泛的应用.随着这些事物的发展,我们每个人都会接触到相当庞大的数据.如何在这些数据中找到自己需要的,如何 ...
- Daily Scrumming* 2015.10.24(Day 5)
一.总体情况总结 从今天开始,我们开始正式进入紧锣密鼓的集中开发周啦~~加油Fighting~ 开会讨论了一下各个人的细致分工,前端后端各自想成员分派任务. 继续各自领域的准备工作,同时开始进行开发. ...
- 20162314 《Program Design & Data Structures》Learning Summary Of The First Week
20162314 2017-2018-1 <Program Design & Data Structures>Learning Summary Of The First Week ...
- 《Spring1之第四次站立会议》
<第四次站立会议> 昨天:我把小组成员找到的写关于登录界面的代码加到了我的项目工程里,并对它有了一定的了解,已经能够编译运行了,得到了登陆的界面: 今天:试着做了一下主框架里的在线人数的显 ...
- C#窗体随机四则运算 (第四次作业)
---恢复内容开始--- 增量内容:1)处理用户的错误输入,比如输入字母或符号等,处理除法运算中分母为0的情况,处理结果为负数的情况,保证是小学水平不出现负数,比如不能出现5-8=-3这种情况:2)用 ...
- 结对随即四则运算(带界面Java版)
//随机四则运算类 public class 随机四则运算 { public static void main(String[] args) { new 界面();//进入随机四则运算的首界面 } } ...
- MIT挑战(如何在12个月内自学完成MIT计算机科学的33门课程|内附MIT公开课程资源和学习顺序
译者注:本文译自Scott H. Young的博客,Scott拥有超强的学习能力,曾在12个月内自学完成麻省理工学院计算机科学的33门课程.本文就是他个人对于这次MIT挑战的介绍和总结. 版权声明:本 ...
- python学习笔记05:贪吃蛇游戏代码
贪吃蛇游戏截图: 首先安装pygame,可以使用pip安装pygame: pip install pygame 运行以下代码即可: #!/usr/bin/env python import pygam ...
- Objective-C KVC讲解,包你看懂会用
KVC:Key Value Coding,取其三个单词首字母浓缩而成.直白翻译过来就是键值编码,什么意思呢?简单来说,就是操作一个对象,也可以像操作字典一样,通过key来取值和赋值. 我们先创建一个H ...
- teamcity和jmeter结合进行接口自动化测试
(1)从teamcity官网下载jmeter插件:https://teamcity.jetbrains.com/repository/download/TeamCityPluginsByJetBrai ...