一、说明

1.1 环境说明

user model如下,且其现有一个实例user_inst:

class User(Base):
__tablename__ = 'users' username = Column(String(32), primary_key=True)
passwd = Column(String(32)) def __repr__(self):
return f"<User(username={self.username}, passwd={self.passwd}>"

event model,且其现有一个实例event_inst:

class Event(Base):
__tablename__ = 'events' id = Column(Integer, primary_key=True)
username = Column(String(32))
event_type = Column(String(32)) def __repr__(self):
return f"<User(username={self.username}, event_type={self.event_type}>"

1.2 需求说明

现在代码某处需要获取实例的主键的值,且希望代码能同时兼容不同model。

在不考虑兼容的情况下,要获取实例主键值,分别写如下即可:

user_inst.username
even_inst.id

但显然user model和event model主键名称是不一样的,这种通过硬编码主键字段名的方式实现不了兼容的要求。

二、不使用字段名获取主键值实现

我们先约定,将user model和event model统称为model;将user_inst和event_inst统称为model_inst。

所谓统称在代码上的实现方法一是直接赋值(如model=User),二是当参数传过去。

2.1 不使用字段名获取主键值实现

from sqlalchemy import inspect

# 获取主键字段名。主键可能有多个,这里只取第一个
primary_key_name = inspect(self.sub_dao_class).primary_key[0].name
# 通过__getattribute__获取字段名对应的值
model_inst.__getattribute__(key)

2.2 注意未赋值情况

对于2.1中的方法,如果user_inst和event_inst都是从数据表中查询出来的实例那是没问题的。

如果不是从表中查出而是新定义的实例,user_inst也是没问题的,但event_inst会有问题。

event model中的id是系统自增长的值,在实例化时我们一般不对其进行初始化,而是在插入数据库时由数据库确定。也就是说如果event_inst是新定义的那么在插入数据库之前其主键(也即id字段)是没有值的,此时通过__getattribute__()方法肯定获取不到主键值----更准确点说是会报错。

Python3+SQLAlchemy不使用字段名获取主键值教程的更多相关文章

  1. mybatis插入数据并获取主键值

    有时候我们的主键是自增的,但是我们想要在插入一条数据以后获取这条数据的主键值,而我们知道,mybatis执行完插入操作以后返回的是生效的记录数.那如何才能获取这个主键值呢. 1.在配置文件mapper ...

  2. mybatis oracle 插入自增记录 获取主键值 写回map参数

    网上搜了好多文章照着弄都返回不了主键给map, 实践证明要在传入的map参数里写回插入的主键,要这样写 <selectKey resultType="java.lang.Integer ...

  3. MyBatis映射文件1(增删改、insert获取自增主键值)

    增删改 Mybatis为我们提供了<insert>.<update>.<delete>标签来对应增删改操作 在接口中写增删改的抽象方法 void addEmp(Em ...

  4. Sqlserver获取所有数据库名,表信息,字段信息,主键信息,以及表结构等。

    --获取所有数据库名: SELECT name FROM master..sysdatabases WHERE name NOT IN ( 'master', 'model', 'msdb', 'te ...

  5. hibernate 获取实体的表名、主键名、列名(转载+修改)

    package com.escs.utils; import java.util.Iterator; import org.hibernate.cfg.AnnotationConfiguration; ...

  6. oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息

    来源于网上整理 总结了一下oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助: 1.查询出所有的用户表select * fro ...

  7. MySQL 插入与自增主键值相等的字段 与 高并发下保证数据准确的实验

    场景描述: 表t2 中 有 自增主键 id  和 字段v  当插入记录的时候 要求 v与id 的值相等(按理来说这样的字段是需要拆表的,但是业务场景是 只有某些行相等 ) 在网上搜的一种办法是 先获取 ...

  8. MySql数据库在表中添加新字段,设置主键,设置外键,字段移动位置,以及修改数据库后如何进行部署和维护的总结

    1,为当前已有的表添加新的字段 alter table student add studentName varchar(20) not null; 2,为当前已有的表中的字段设置为主键自增 alter ...

  9. mysql update获取主键

    mysql update获取主键<pre>SET @update_id := 0;UPDATE mobantestinfo1 SET info2 = 'value', id = (SELE ...

随机推荐

  1. 解决 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 问题

    https://blog.csdn.net/weixin_41196185/article/details/81114226 今天在启动vue项目的时候报了这样一个错误 观察到关键词是 FATAL E ...

  2. iPhone屏蔽IOS更新、iPhone系统更新的提示(免越狱,有效期更新至2021年)

    iPhone屏蔽IOS更新.iPhone系统更新的提示(免越狱,有效期更新至2021年) 1.在Safari浏览器中粘贴如下链接,按提示打开链接. 输入http://apt.dataage.pub 2 ...

  3. excel 八位二进制转换为十六进制公式

    =BIN2HEX(C16&D16&E16&F16&G16&H16&I16&J16,2)

  4. Gradle引人注目的特性集

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML.当前其支持的语言限于Java. ...

  5. 艾妮记账本Web开发(开发版)

    因为没有办法制作微信小程序版的艾妮记账本所以只能选择做Web开发版,但因为是花时间赶出来到的(但用了我已学的所有Web知识)所以就没有办法按老师的要求写七天的制作过程. 其实真正说起来我的这个Web开 ...

  6. 移动端热更新方案(iOS+Android)

    PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5% ...

  7. java之接口文档规范

    一.xxxxxx获取指定任务爬取的所有url的接口 接口名称:xxxxxx获取指定任务爬取的所有url的接口 访问链接: http://IP:PORT/crwalTask/findUrlExcepti ...

  8. codeforces #305 E Mike and friends

    原问题可以转化为:给定第k个字符串,求它在L-R的字符串里作为子串出现了多少次 定义子串为字符串的某个前缀的某个后缀(废话) 等价于我们把一个字符串插入到trie里,其过程中每个经过的节点和其向上的f ...

  9. esp32-micropython

    本来之前买和另一贴子的esp8266一起买了一块esp32. 现在开发esp的大概有乐鑫的ide以及基于乐鑫定制的.arduino.nodemcu.还有就是现在要讲的micropython. 乐鑫的主 ...

  10. 自制操作系统Antz(2)——进入保护模式 (上) jmp到保护模式

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.htm Linux内核源码分析地址:https://www.cnblogs.c ...