python orm开发模型_python的ORM模型SQLAlchemy

2023-10-31

SQLAlchemy 是python 操作数据库的一个库。能够进行 ORM 映射 SQLAlchemy采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型 本文在实例的基础上加上注释来解释如何利用SQLAlchemy的ORM模型像操作类一样实现对数据库的操作

SQLAlchemy 是python 操作数据库的一个库。能够进行ORM映射

SQLAlchemy采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型

本文在实例的基础上加上注释来解释如何利用SQLAlchemy的ORM模型像操作类一样实现对数据库的操作。

#coding:utf-8

__author__ = 'itzhoulin'

from sqlalchemy import Integer, String, BIGINT, DateTime, VARCHAR, and_, Table, Sequence

from sqlalchemy import create_engine, MetaData, Column

from sqlalchemy.orm import sessionmaker

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

#首先设置数据库连接,更多数据库连接设置方式参考官网手册:

#http://docs.sqlalchemy.org/en/rel_0_9/core/engines.html#database-urls

db_url = 'postgresql://testdb:123456@192.168.14.78/testdbdb'

#创建一个Engine实例,指向通过db_url设置的数据库,这仅仅表示到数据库的接口已经建立,

# 但是并没有连接到数据库,仅仅当执行Engine.execute() 或者 Engine.connect()时才真正建立连接。

engine = create_engine(db_url)

#当使用ORM模式的时候,需要为每一个Table建立一个以Base为基类的类,

class host(Base):

#这个类必不可少的一项就是tablename和至少一个Column(设置 为primary_key)

__tablename__ = 'gci_server_orm'

id = Column(Integer, primary_key = True)

hostname = Column(String(30), nullable = False)

ip = Column(String(16), nullable = False)

fsid = Column(String(60), nullable = False)

type = Column(String(10),nullable = False)

#定义__repr__函数是为了显示该类,可以自定义,是可选的

def __repr__(self):

return "" % (\

self.hostname,self.ip,self.fsid,self.type)

##Additionally, Firebird and Oracle require sequences to generate new primary key identifiers,

# and SQLAlchemy doesn’t generate or assume these without being instructed.

# For that, you use the Sequence construct:

#对于postgresql而言,会自动新建,这里指定是为了设定自增起始值,关于Sequence的详细说明请看

# http://docs.sqlalchemy.org/en/latest/core/defaults.html#sqlalchemy.schema.Sequence

class fsuser(Base):

__tablename__ = 'fsusers_orm'

id = Column(BIGINT, Sequence('fsuser_aid_seq', start=5000, increment=1), primary_key=True)

user_name = Column(VARCHAR(50),nullable=False)

user_pwd = Column(VARCHAR(500),nullable=False)

fsid = Column(String(60),nullable=False)

# mount_point = Column(VARCHAR(50))

# uuid = Column(VARCHAR(50))

# flag = Column(VARCHAR(1))

def __repr__(self):

return "" % (\

self.user_name,self.user_pwd,self.fsid)

#可以输出看一下定义的类,这里需要注意的是,这里的String和VARCHAR都定义了长度的,

# 对于sqlite和postgresql不定义长度也是可以的,但是其他数据就不行,

##Users familiar with the syntax of CREATE TABLE may notice that the VARCHAR columns were generated

# without a length; on SQLite and Postgresql, this is a valid datatype, but on others, it’s not allowed.

# So if running this tutorial on one of those databases, and you wish to use SQLAlchemy to issue CREATE TABLE,

# a “length” may be provided to the String type as below:

# Column(String(50))

print host.__table__

#定义一个Metadata,它是一个容器对象,能够描述一个数据库或者多个数据库的很多不同特性。

#Table对象是被连接到Metadata的,Table是由诸多Column组成的,

#Base类包含有.metadata方法,因此新建Table方法如下,跟不使用ORM的时候一样

Base.metadata.reflect(engine)

# 清除上面定义的两个类对应的Table

# Base.metadata.drop_all(engine)

# 新建上面定义的两个Table,

Base.metadata.create_all(engine)

#上面drop和create是通过Base类来实现对其上下文定义的所有Table进行操作的

# ##新建类的实例,Base类定义有__init__方法,会接收值并赋给Table中设置的Column

host1=host(hostname='host4.test.com',ip='10.1.35.27',fsid='1qazxsw23edcvfr4',type='s3')

print host1.hostname

#这里实际还没有写入数据库,只是生成一个跟数据库mappered的类的实例,

# 因此主键id并没有实际值,但是引用也不会报错,返回None

print host1.id

#连接数据库,ORM模式下跟数据库的实际连接是通过Session

Session = sessionmaker(bind=engine)

## 如果新建Session的时候还没有生成engion,可以通过下面的两步先后设置

#Session = sessionmaker()

#Session.configure(bind=engine)

##这样每当需要跟数据库进行操作的时候实例化Session就行

session = Session()

#这里新建了实例session,但是也并没有打开跟数据库的连接,仅当第一次开始试用时才建立连接,

# 而且仅当women提交所有的变更或者手动关闭session的时候才断开连接

# #插入一条记录,以上问的host1为例:

session.add(host1)

#

#能够修改其中的某一个记录,同时session知道我们修改了这个数据

host1.fsid = 'abcdefghijklmnopqresuvmxyz'

#通过dirty来判定session里面的数据是否有修改

session.dirty

# #Out[40]: IdentitySet([])

#

# #或者添加多条记录

session.add_all([

fsuser(user_name='user1',user_pwd='123456',fsid='abcdefghijklmnopqresuvmxyz'),

fsuser(user_name='user3',user_pwd='123456',fsid='abcdefghijklmnopqresuvmxyz'),

host(hostname='host2.test.com',ip='10.1.35.24',fsid='1qazxsw23edcvfr4',type='samba')

])

# #此时通过session的new方法获取新加的记录

session.new

# #Out[43]: IdentitySet([

# # ,

# # ,

# # ])

##===注意:此时并没有实际写入数据库=======

user1 = fsuser(user_name='user7',user_pwd='zhoulin',fsid='abcdefghijklmnopqresuvmxyz')

session.add(user1)

#仅仅当执行commit之后才会实际写入数据库

session.commit()

##数据项修改,需要先查询以获得前面定义的Table的实例

##all()获取所有符合条件的数据项,返回结果是一个列表,and_用于定义多个查找匹配项

for user2 in session.query(fsuser).filter(and_(fsuser.user_name=='user7',\

fsuser.user_pwd=='itzhoulin',fsuser.fsid=='abcdefghijklmnopqresuvmxyz')).all():

# for user2 in session.query(fsuser).filter(fsuser.user_name=='user7').all():

print user2

print user2.user_pwd

# #将前面的修改提交到数据库

print user2

user2.user_pwd='yifangzhoulin'

print user2

session.commit()

#session的回滚功能,比较赞

host1.hostname='host1-2.test.com'

#修改后查询一下

session.query(host).filter(host.ip=='192.168.35.23').all()

# Out[52]: []

#回滚后再查询一下:

session.rollback()

session.query(host).filter(host.ip=='192.168.35.23').get(1)

# Out[60]:

#

#

# ###查询的方法很多,一看就能明白,选择合适的

#下面result的值即位一个string类型的,实际为ip的值,由此可见all()返回列表,取一条记录中的某一个值直接点号

result= session.query(host).filter(and_(host.fsid=='1qazxsw23edcvfr4',host.hostname=='host3')).all()[0].ip

for instance in session.query(fsuser).order_by(fsuser.id):

print instance.name, instance.fullname

#

for name, fullname in session.query(fsuser.user_name, fsuser.fullname):

print name, fullname

#

for row in session.query(fsuser, fsuser.user_name).all():

print row.User, row.name

#

#关于label还是很清楚,我的理解就是给某一项一个别名

for row in session.query(fsuser.user_name.label('name_label')).all():

print(row.name_label)

#

#这里的aliased就是专门给Table设置别名的

from sqlalchemy.orm import aliased

user_alias = aliased(fsuser, name='user_alias')

for row in session.query(user_alias, user_alias.name).all():

print row.user_alias

#query返回的是列表,这个比较好理解,查询返回排序

for u in session.query(fsuser).order_by(fsuser.id)[1:3]:

print u

##这里需要注意的就是filter_by和filter两者的区别,

for name, in session.query(fsuser.user_name).filter_by(fullname='Ed Jones'):

print name

for name, in session.query(fsuser.user_name).filter(fsuser.fullname=='Ed Jones'):

print name

#

for user in session.query(fsuser).filter(fsuser.user_name=='ed').filter(fsuser.fullname=='Ed Jones'):

print user

##删除,一样的首先需要query查询获得一个实例

host1 = session.query(host).filter(and_(host.hostname=='host3',host.fsid == '1qazxsw23edcvfr4')).first()

session.delete(host1)

session.commit()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python orm开发模型_python的ORM模型SQLAlchemy 的相关文章

  • git checkout XXX error: Your local changes to the following files would be overwritten by 解决方案

    0 问题现象描述 当我们在使用git checkout 命令时 如果本地有修改的代码没有提交 则无法切换分支 git会提示你本地有未提交的代码 本地修改会被覆盖 git checkout review0329 error Your loca
  • 阿里榜单&常见标识

    上星期有很多小伙伴们也发现了阿里的Most Popular on Alibaba的变化 但是还是有部份的小伙伴不太了解 今天柒哥带领伙伴们去深入了解一些阿里常见的榜单以及普及下阿里常见一些标志代表的含义 首先让我们先了解下这个Popular
  • spark使用实现

    为什么80 的码农都做不了架构师 gt gt gt spark启动 spark shell master local 2 spark实现wc val file sc textFile file home hadoop data hello
  • ESP32S3学习——SPI

    芯片 esp32 开发环境 espidfv4 4 一 官网相关资料 又是英文 1 简介 SPI 没啥信息 跳过 2 esp32s3 SPI外设介绍 ESP32 S3集成了4个SPI外围设备 emm 实际能用的是两个 SPI0和SPI1在内部
  • Kettle循环获取结果集

    文章目录 1 Kettle循环获取结果集 1 1 效果图 1 2 转换介绍 1 3 job介绍 1 4 运行job结果 2 关于Kettle中JavaScrpit的使用 1 Kettle循环获取结果集 1 1 效果图 job j1 kjb
  • 黑马jvm课程笔记d1

    目录 一 堆内存相关 1 1 定义 1 2堆内存溢出 1 2 1 堆内存内存诊断工具 二 方法区相关 2 1 方法区组成 2 2 方法区内存溢出 2 3 方法区内常量池 2 4 运行时常量池 三 StringTable相关 3 1 Stri
  • [1136]Linux中date时间和hwclock时间不一致

    文章目录 1 在同步时间前需要先检查时区是否是china的CTS时区 2 操作系统有两个时间 软件时间和硬件时间 1 在同步时间前需要先检查时区是否是china的CTS时区 必须确保时区准确 否则时间同步后显示不正常 2 如果时区不正确 如
  • 【车联网原型系统|一】项目介绍+需求分析+概要设计

    物联网原型系统导航 车联网原型系统 一 项目介绍 需求分析 概要设计 https blog csdn net weixin 46291251 article details 125807297 车联网原型系统 二 数据库 应用层协议设计 h
  • 前端安全性问题以及防御措施

    整理一下前端开发过程中经常遇到的安全问题 1 xss跨站脚本攻击原理 如何进行 防御手段 如何进行 XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点 进而添加一些代码 嵌入到web页面中去 使别的用户访问都会执行
  • Python多线程 Threading

    1 介绍 多线程是加速程序计算的有效方式 Python的多线程模块threading上手快速简单 从这节开始我们就教大家如何使用它 2 添加线程 本节我们来学习threading模块的一些基本操作 如获取线程数 添加线程等 首先别忘了导入模
  • Nova: 2 Nova源码以及服务路径

    目标 1 弄清楚nova组件通过packstack安装后源码位置 2 确定nova组件服务启动路径 3 确定nova组件配置文件路径 0 whereis nova root localhost www whereis nova nova u
  • 怎么往钉钉群里发文件_钉钉授课教程

    一 课前直播准备 建立钉钉班级群 如果学校已经开通了钉钉 家校通讯录 那么老师只要进入自己所在的钉钉班级群看看还有哪些学生未加入 也可多邀请学生家长捆绑到学生上 以备妈妈的手机不能用 还可以用爸爸的 如果自己的学校还没有开通钉钉 家校通讯录
  • Linux软件包安装(rpm、yum、apt-get)

    http m blog csdn net suixin788 article details 52555558 Linux的发行版之间的联系和区别 http m blog csdn net wanghui499917270 article
  • 互斥和同步-读者/写者问题

    读者 写者问题 问题定义 存在一个多进程共享的数据区 该数据区可以是 一个文件或者一块内存或者一组寄存器 有些进程reader只读取该数据区中的数据 有些进程writer只往数据区写数据 满足条件 任意数量的读进程可以同时读该文件 一次只有
  • [LeetCode]235 二叉查找树的最近公共父亲节点

    Lowest Common Ancestor of a Binary Search Tree 二叉查找树的最近公共父亲节点 难度 Easy Given a binary search tree BST find the lowest com
  • 解决项目中出现问题 Cannot resolve com.xpand:starter-canal:0.0.1-SNAPSHOT

    解决方案 https www cnblogs com dalianpai p 14010753 html 亲测有效 编译通过 第一步 前往https github com chenqian56131 spring boot starter
  • Homebrew 更换国内源

    eval opt homebrew bin brew shellenv export HOMEBREW BREW GIT REMOTE https mirrors ustc edu cn brew git export HOMEBREW C
  • 【Spring】Feign客户端发送HTTPS请求绕过认证

    1 概述 转载 https www jianshu com p ea627708ab52 一个Spring Boot项目 为了使用Harbor仓库 起初通过Spring RestTemplate完成了对Harbor仓库的HTTPS请求 后想
  • 编程调节Win7/Win8系统音量的一种方法

    include

随机推荐

  • Cheat Engine使用教程

    系列文章目录 文章目录 系列文章目录 前言 一 解决办法 二 使用步骤 1 下载Cheat Engine 2 设置 前言 计算机硬盘不够用 但里面很多文件也舍不得删除 只有靠百度网盘来撑撑大小了 所以省吃俭用购买了百度会员 心疼每个月好几十
  • MPI_Bcast函数的用法

    程序功能 MPI Bcast函数用法 作成日期 2016 12 14 详细说明 include
  • AltiumDesigner如何绘制PCB封装

    AltiumDesigner如何绘制PCB封装 一 为什么要自己画PCB封装 当我们需要用的一些元器件PCB封装库中找不到的时候 我们就需要自己手动绘制一些元器件的PCB封装 当然也可以选择用相似的代替 但是在一些长场合中并不允许我们这样做
  • openwrt编译问题记录

    目录 1 git clone 速度太慢甚至断开连接 2 编译openwrt镜像make时发生错误 3 scripts feeds install a 时出现警告 1 git clone 速度太慢甚至断开连接 解决办法 在clone时将git
  • 如何显示文件后缀

    一 如何显示文件后缀 1 首先打开电脑上的本地磁盘D 2 然后点击组织 3 在弹出的窗口中点击文件夹和搜索 4 在弹出的窗口在点击查看 5 下拉滚动条 6 最后取消勾选隐藏已知文件类型的扩展名
  • 编程珠玑第三章习题5——英语中的连字符问题

    编程珠玑第三章习题5 英语中的连字符问题 问题 本问题将处理一小部分用连字符连接的英语单词方面的问题 下面的规则列表描述了一些以字母c结尾的单词的有效连字符连接 et ic al is tic s tic p tic lyt ic ot i
  • 使用Python语言实现凯撒密码的加密和解密

    使用Python语言实现凯撒密码的加密和解密 介绍 在密码学中 恺撒密码 英语 Caesar cipher 或称恺撒加密 恺撒变换 变换加密 是一种最简单且最广为人知的加密技术 它是一种替换加密的技术 明文中的所有字母都在字母表上向后 或向
  • Nginx配置https访问

    1 准备好证书和秘钥 如果是云服务器 可以到对应的云服务器上购买ssl证书 我这里是百度云 我以百度云为例子 直达链接 https console bce baidu com cas cas apply create 这个是免费1年的 可以
  • sql server数据库常见语句——增删查改

    一表数据增删查改 1 查询 select from 表名 select from test 2 新增 insert 表名 字段1 字段2 values 值1 值2 insert test a b values 1 2 3 修改 update
  • Meetup回顾|星策社区FeatureStore Meetup V2

    继2021年12月11日举办第一次Feature Store Meetup之后 星策开源社区于2022年4月10日举办了第二期 FeatureStore Meetup V2 本次活动邀请星策社区发起人 中国开源推进联盟副秘书长 开放原子基金
  • ADC外部RC电路电阻和电容选取计算方法

    ADC采样过程中遇到的问题 ADC是从模拟到数字世界的桥梁 当前ADC模块基本是MCU的标配 而且在转换速度和精度都有很好的表现 如NXP Kinetis KE15内部有2个16bit SAR型ADC模块 以精度制胜 可以配合EDMA完美实
  • vue实现音频audio列表循环,实现暂停播放切换

    功能界面如下 功能使用如下 首先根据后端返回的音频地址进行渲染 其中playAudioSrc字段用来控制暂停样式还是播放样式 audio进行隐藏 ul class virtualAvararFooterRightContentAudio l
  • vue局部注册指令和全局注册指令

    全局注册 1 目录下创建directive文件夹 然后下面就是各指令文件 还有一个总包括指令directive js 标识所有的指令都会引入到这里 import testA from testA import testB from test
  • STM32 CubeMx教程 -- 基础知识及配置使用教程

    文章目录 前言 一 STM32CubeMx 界面介绍 File 界面 Windows 界面 Help 界面 Updater Settings 界面 二 STM32CubeMx 使用教程 新建工程 配置RCC时钟参数 配置SYS参数 配置时钟
  • FPGA project : VGA

    module vga ctrl input wire vga clk input wire vga rst n input wire 15 00 pix data output wire hsync output wire vsync ou
  • 虚拟机使用前的一些小配置

    最近在学mongodb 为了能深入理解 所以我一边学一边整理一些乱七八糟的笔记 下载安装VMware Workstation Pro和Xshell7 以及获取镜像 创建虚拟机 安装CentOS7系统的过程就不多说了 反正现在的情况就是 我们
  • 【ARIMA-WOA-CNN-LSTM】合差分自回归移动平均方法-鲸鱼优化-卷积神经网络-长短期记忆神经网络研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 ARIMA模型 1 2 鲸鱼优化算法 1 3 卷积神经网络 1 4 LSTM 模型 2 运行结果
  • 【Unity3D游戏开发学习笔记】(四)一切都动起来—Animator组件的应用

    一 Animation简介 动画原本是指由许多连续的图片在人眼前面快速播放 肉眼因视觉残像产生错觉 而误以为画面活动的作品 但在 Unity3D 中的 Animation 动画 系统应该这样理解 用于为游戏者自动播放人物动作或自动演示物体运
  • Python小白菜&老手常犯的报错:requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

    人生苦短 我用python 最近最常被问到的报错问题就是 requests exceptions JSONDecodeError Expecting value line 1 column 1 char 0 某平台商品评论为例 源码 资料电
  • python orm开发模型_python的ORM模型SQLAlchemy

    SQLAlchemy 是python 操作数据库的一个库 能够进行 ORM 映射 SQLAlchemy采用简单的Python语言 为高效和高性能的数据库访问设计 实现了完整的企业级持久模型 本文在实例的基础上加上注释来解释如何利用SQLAl