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 过滤预先加载的实体集合 问题 你想过滤预先加载的实体集合,另外,你想使用 ...
随机推荐
- sprint2 (第八天)
今天课多,没做什么功能.这个sprint定的目标比较高,要实现的功能较多,可能完成不了目标值.因为GitHub下载和上传很慢,经常失败,所以这几天都没有更新GitHub,功能明天早点实现然后上传到Gi ...
- LeetCode 561. Array Partition I (C++)
题目: Given an array of 2n integers, your task is to group these integers into npairs of integer, say ...
- 【每日scrum】第一次冲刺day2
和小伙伴一起找地图 ,学习了mapinfo地图格式的基本知识,数据和图像分开存储
- OTCL,面向对象的脚本一
Otcl 简介 面向对象的脚本语言 类变量和类方法 Otcl的基类称为Object(类的名字,不是面向对象中的"对象"),所以的Otcl类都是从Object派送来的. 直接贴代码, ...
- 项目Beta冲刺(团队)总结
团队成员及分工 姓名 学号 分工 陈家权 031502107 前端(消息模块) 赖晓连 031502118 前端(问答模块) 雷晶 031502119 服务器 林巧娜 031502125 前端(首页模 ...
- Beta Scrum Day 5 — 听说
听说
- 获取ios设备的udid
今天get的第二个技能~~~ UDID指的是设备的唯一设备识别符,ipa包未上架之前如果不添加udid是无法安装成功的.那么如何快速获取ios设备的udid呢? 今天get的方法是用蒲公英,网址:ht ...
- beta发布简评
第一组:新蜂小组 题目:俄罗斯方块 评论:主体功能已经完成,可以流畅的进行游戏,无论效果或是功能都实现的很好. 第二组:Nice团队 题目:约跑APP(约吧) 评论:作为应用,想法创意很好:功能实现上 ...
- PAT 1078 字符串压缩与解压
https://pintia.cn/problem-sets/994805260223102976/problems/994805262018265088 文本压缩有很多种方法,这里我们只考虑最简单的 ...
- JS 随机整数
<script> function GetRandomNum(Min,Max){ var Range = Max - Min; var Rand = Math.random() ...