西游之路——python全栈——ORM之SQLAlchemy(3)外键与relationship的关系

目录

relationship是为了简化联合查询join等,创建的两个表之间的虚拟关系,这种关系与标的结构时无关的。他与外键十分相似,确实,他必须在外键的基础上才允许使用

不然会报错:

sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Father.son - there are no foreign keys linking these tables.  Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a ‘primaryjoin‘ expression

详细的relationship可以点击这里进行查看

relationship的使用:

使两个表之间产生管理,类似于合成一张表,可以直接取出关联的表,进行获取数据,而不需要join操作

 1 import sqlalchemy
 2 from sqlalchemy import create_engine
 3 from sqlalchemy import Column,String,Integer,ForeignKey
 4 from sqlalchemy.orm import sessionmaker,relationship
 5 from sqlalchemy.ext.declarative import declarative_base
 6
 7 engine = create_engine("mysql+pymysql://root:[email protected]/t1")
 8
 9 Base = declarative_base()
10
11 class Father(Base):
12     __tablename__ = "father"
13
14     id = Column(Integer,primary_key=True,autoincrement=True)
15     name = Column(String(40),unique=True)
16     age = Column(Integer)
17     son = relationship(‘Son‘,backref="father")
18
19 class Son(Base):
20     __tablename__ = ‘son‘
21
22     id = Column(Integer,primary_key=True,autoincrement=True)
23     name = Column(String(40),unique=True)
24     age = Column(Integer)
25
26     father_id = Column(Integer,ForeignKey(‘father.id‘))
27
28 Base.metadata.create_all(engine)
29
30 MySession = sessionmaker(bind=engine)
31 session = MySession()
32
33 # f = Father(name=‘ld‘,age=21)
34 # session.add(f)
35 # session.commit()
36 #
37 # s1 = Son(name=‘ww‘,age=1,father_id=1)
38 # s2 = Son(name=‘wb‘,age=0,father_id=1)
39 # session.add_all([s1,s2])
40 # session.commit()
41 #一对多情况下:多(包含外键方)
42
43 ret =session.query(Father).filter_by(id=1).first()
44 #ret.son 是一个列表,其中多的一方会获得一个列表结果,列表中含有其各个对象
45 for i in ret.son:
46     print(i.name,i.age)
47
48
49 #另一方只会获得一个对象结果
50 ret2 = session.query(Son).filter_by(id=1).first()
51 print(ret2.father.name)#
52
53 原来代码,不需要看

原来代码,不需要看

只使用外键,需要使用join才可以取出数据

#上面不存在relationshipret = session.query(Father.name.label(‘kkk‘),Son.name.label("ppp")).join(Son).all()#使用Join才可以获取对方数据
print(ret)#是一个列表,列表中存在所要获取的数据(以元组存在)

在外键基础上使用relationship:可以直接通过属性操作获取数据

#使用了relationshipret = session.query(Father).filter_by(id=1).first()
print(ret.son)#是一个对象列表,其中包含了所有查询数据

全部代码:

其中son = relationship(‘Son‘,backref="Father")

相当于在Son中加入father = relationship(‘Father‘)在Father中加入son = relationship(‘Son‘)

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy import Column,String,Integer,ForeignKey
from sqlalchemy.orm import sessionmaker,relationship
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine("mysql+pymysql://root:[email protected]/t1")

Base = declarative_base()

class Father(Base):
    __tablename__ = "father"

    id = Column(Integer,primary_key=True,autoincrement=True)
    name = Column(String(40),unique=True)
    age = Column(Integer)
    son = relationship(‘Son‘,backref="Father")
    #son = relationship(‘Son‘)

class Son(Base):
    __tablename__ = ‘son‘

    id = Column(Integer,primary_key=True,autoincrement=True)
    name = Column(String(40),unique=True)
    age = Column(Integer)
    #father = relationship(‘Father‘)

    father_id = Column(Integer,ForeignKey(‘father.id‘))

Base.metadata.create_all(engine)

MySession = sessionmaker(bind=engine)
session = MySession()

ret = session.query(Father).filter_by(id=1).first()
print(ret.son) #多个结果[<__main__.Son object at 0x0000000003F192B0>, <__main__.Son object at 0x0000000003F19320>]
#需要循环取值

ret = session.query(Son).filter_by(id=1).first()
print(ret.father)#一个结果<__main__.Father object at 0x0000000003F196D8>
#直接取值

原文地址:https://www.cnblogs.com/Lujun1028/p/9961092.html

时间: 2024-10-08 13:08:11

西游之路——python全栈——ORM之SQLAlchemy(3)外键与relationship的关系的相关文章

西游之路——python全栈——ORM之SQLAlchemy(1)

目录 定义一个类,ORM(对象关系映射)将这个类转换为sql语句,使用pymysql进行执行 一,底层处理 使用engine/connectionpooling/dialect进行数据库操作,engine使用connectionpooling连接数据库,然后在通过dialect执行sql语句(SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API) pymysql mysql+pymysql:/

西游之路——python全栈——Django~1

知识预览 Django基本命令 二 路由配置系统(URLconf) 三 编写视图 四 Template 五 数据库与ORM admin的配置 一 什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端.   最简单的Web应用就是先把HTML用文件保存好,用一个现

西游之路——python全栈——django中models配置

目录 Django支持多种数据库,sqlite,mysql,oracle等,其默认数据库是sqlite 在settings文件中可以发现: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } 其默认数据库是sqlite3 要想使用其他数据库,需要修改相应的引擎和配置 (1)sqlite: 'ENGINE': 'dja

西游之路——python全栈——通用模块(pager、check_code、form验证)

1.验证码 1 import random 2 from PIL import Image, ImageDraw, ImageFont, ImageFilter 3 4 _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z 5 _upper_cases = _letter_cases.upper() # 大写字母 6 _numbers = ''.join(map(str, range(3, 10))) # 数字 7

西游之路——python全栈——自定义用户认证

django自定义用户认证(使用自定义的UserProfile,而不是django自带的),就需要(django要求)将为UserProfile单独创建一个app,这个app啥也不干,就是为UserProfile而生的; 这里我们创建一个app,名字叫做custom_auth,事实上,我们只需要对其中的models文件和admin.py做操作就可以了; 第一步:  创建user model 下面是models.py文件的内容: 1 from django.utils.safestring imp

西游之路——python全栈——Form组件字段及动态绑定

一.HTML中 | safe  可在后台用以下方式处理 1 text = "<input type'text' />" 2 from django.utils.safestring import mark_safe 3 text = mark_safe(text) 二.views.py操作 1 from django.shortcuts import render 2 3 from django import forms 4 from django.forms import

西游之路——python全栈——瀑布流

############################### class Picture(models.Model): src = models.ImageField(verbose_name='图片路径', upload_to='./static/images/picture/') title = models.CharField(verbose_name='标题', max_length=32) summary = models.CharField(verbose_name='简介', m

西游之路——python全栈——报障系统之后台管理

一.后台管理页面布局 1.用户: - 普通用户 知识库+提交报账单+个人信息 - 管理员 知识库+提交报账单+个人信息+处理报账单 - 超级管理员 知识库+提交报账单+个人信息+处理报账单+报障统计信息 权限管理2.菜单: - 知识库管理 文章 标签 分类 - 报障管理 个人报障 报障处理 报障统计信息 - 权限管理 菜单 权限 角色 二.公共模板及路由分发 1.后台菜单栏.导航栏 1 <!DOCTYPE html> 2 <html lang="en"> 3 &

Python全栈之路系列之赋值与运算符

Python全栈之路系列之赋值与运算符 在继续下面的文章之前我们先来浏览一下Python为我们提供的几种运算符,定义两个变量,分别是a和b,a的值是10,b的值是20. 算术运算符 运算符 描述 实例 + 加,两个对象相加 a+b=30 - 减,两个对象相减,可能会得到负数 a-b=-10 * 乘,两数相称或是返回一个被重复若干次的字符串 a*b=200 / 除,两个对象相除 b/a=2 % 取膜,返回除法的余数 b%a=0 ** 幂,返回x的y次幂 a**b=10000000000000000