Python3+SQLAlchemy不使用字段名获取主键值教程
一、说明
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不使用字段名获取主键值教程的更多相关文章
- mybatis插入数据并获取主键值
有时候我们的主键是自增的,但是我们想要在插入一条数据以后获取这条数据的主键值,而我们知道,mybatis执行完插入操作以后返回的是生效的记录数.那如何才能获取这个主键值呢. 1.在配置文件mapper ...
- mybatis oracle 插入自增记录 获取主键值 写回map参数
网上搜了好多文章照着弄都返回不了主键给map, 实践证明要在传入的map参数里写回插入的主键,要这样写 <selectKey resultType="java.lang.Integer ...
- MyBatis映射文件1(增删改、insert获取自增主键值)
增删改 Mybatis为我们提供了<insert>.<update>.<delete>标签来对应增删改操作 在接口中写增删改的抽象方法 void addEmp(Em ...
- Sqlserver获取所有数据库名,表信息,字段信息,主键信息,以及表结构等。
--获取所有数据库名: SELECT name FROM master..sysdatabases WHERE name NOT IN ( 'master', 'model', 'msdb', 'te ...
- hibernate 获取实体的表名、主键名、列名(转载+修改)
package com.escs.utils; import java.util.Iterator; import org.hibernate.cfg.AnnotationConfiguration; ...
- oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息
来源于网上整理 总结了一下oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助: 1.查询出所有的用户表select * fro ...
- MySQL 插入与自增主键值相等的字段 与 高并发下保证数据准确的实验
场景描述: 表t2 中 有 自增主键 id 和 字段v 当插入记录的时候 要求 v与id 的值相等(按理来说这样的字段是需要拆表的,但是业务场景是 只有某些行相等 ) 在网上搜的一种办法是 先获取 ...
- MySql数据库在表中添加新字段,设置主键,设置外键,字段移动位置,以及修改数据库后如何进行部署和维护的总结
1,为当前已有的表添加新的字段 alter table student add studentName varchar(20) not null; 2,为当前已有的表中的字段设置为主键自增 alter ...
- mysql update获取主键
mysql update获取主键<pre>SET @update_id := 0;UPDATE mobantestinfo1 SET info2 = 'value', id = (SELE ...
随机推荐
- CSS-对于IE的兼容问题处理
css兼容问题 兼容问题 1.文字本身的大小不兼容.同样是font-size:14px的宋体文字,在不同浏览器下占的空间是不一样的,ie下实际占高16px,下留白3px,ff下实际占高17px,上留白 ...
- select,poll,epoll
1. Epoll 是何方神圣? Epoll 可是当前在 Linux 下开发大规模并发网络程序的热门人选, Epoll 在 Linux2.6 内核中正式引入,和 select 相似,其实都 I/O 多路 ...
- [js]js代码执行顺序/全局&私有变量/作用域链/闭包
js代码执行顺序/全局&私有变量/作用域链 <script> /* 浏览器提供全局作用域(js执行环境)(栈内存) --> 1,预解释(仅带var的可以): 声明+定义 1. ...
- 【C】NO.85.EBook.10.C.1.001-【C primer plus】-
1.0.0 Summary Tittle:[C]NO.85.EBook.10.C.1.001-[C primer plus]- Style:C Series:C Since:2018-02-06 En ...
- 解决bootstrap 模态框 数据清除 验证清空
$("#switchModel").on("hidden.bs.modal", function () { $('#ware-form')[0].reset() ...
- Java第二次考试
代码 package sizeyunsuan; import java.io.FileNotFoundException; import java.io.PrintStream; import jav ...
- python模块的学习
# time 模块 import time print(time.time()) #当前的时间挫 #time.sleep(3) #休息3秒钟,这3秒cpu不工作的 print(time.gmtime( ...
- url的参数解析成key-value
function urlController(url) { var _url = url.split("?")[1]; if(!_url){ return {}; } var wi ...
- C#计算两个时间年份月份差
C#计算两个时间年份月份差 https://blog.csdn.net/u011127019/article/details/79142612
- Linux curl 网络访问
Linux curl 网络访问 参数详解 -a/--append 上传文件时,附加到目标文件 -A/--user-agent <string> 设置用户代理发送给服务器 -anyauth ...