笔记-ORM-sqlalchemy
笔记-ORM-sqlalchemy
1. ORM
1.1. ORM框架简介
对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
1.2. 总结
简单来说,因为数据库和开发软件之间的低关联性,开发人员无法直接了解到类对象与DB中表结构及数据的关联性,在修改数据库表结构时需要分别操作数据库并同时修改各处代码,对项目而言是非常麻烦的。
将定义数据库表结构,操纵数据等功能能抽象化,独立出来,配合一定语法,就是ORM了。
对不同的数据库,语言之间的ORM库是不通用的,每一个组合都需要构建新的接口。
2. SQLALchemy
2.1. 简介
The Python SQL Toolkit and Object Relational Mapper
2.2. 实验环境配置
mysql数据库安装配置
略
库安装
pip install sqlalchemy
3. 代码
# sqlalchemy使用测试
# sqlalchemy
from sqlalchemy import Column,String,create_engine,INTEGER,Text
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 创建连接
# 格式mysql+pymysql://username:password@ip:db port/db
engine = create_engine('mysql+pymysql://dev_python:123456@localhost:3306/db_python', max_overflow=5)
# 测试连接是否可用
# execute是执行sql 语句
result = engine.execute('select * from t2')
#print(result.fetchall())
# 声明会话对象
session_class = sessionmaker(bind=engine)
session = session_class()
# 使用ORM方式创建表格
# 当然也可能通过执行SQL语句的方式创建表
# 声明一个基类
# 使用Declarative方法定义的映射类依据一个基类,
# 这个基类是维系类和数据表关系的目录-Declarative base class
# 在一个普通的模块入口中,应用通常只需要有一个base的实例。
# 通过declarative_base()功能创建一个基类:
base = declarative_base()
# 声明表类
class User(base):
__tablename__ = 'user_1'
id = Column(String(20), primary_key=True)
name = Column(String(40))
password = Column(String(30))
context = Column(String(100))
col_test = Column(INTEGER)
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.name)
# 创建表
# 注意:如果表已存在,并不会改动旧表
# 需要了解一下是否有只创建指定表的方法,好像没有。。。。
# print(dir(base.metadata))
# base.metadata.drop_all(engine)
#base.metadata.create_all(engine)
# 删除表
# base.metadata.drop_all(engine)
# 实例化一条记录
new_user = User(id='6', name='ed', password='edspassword', context='reflow
paint')
new_user1 = User(id='7', name='ed', password='edspassword', context='reflow
paint')
# 新增数据到类中并提交到数据库
#session.add(new_user)
#session.add(new_user1)
session.commit()
# session.rollback()
# 表关系
# 上面是最简单的表,没有外键
from sqlalchemy import ForeignKey
# 一对多
class User_2(base):
__tablename__ = 'user_2'
id = Column(INTEGER,
primary_key=True)
name = Column(String(64), nullable=False, index=True)
password = Column(String(64), nullable=False)
email = Column(String(64))
#articles =
relationship('Article')
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.name)
class Article(base):
__tablename__ = 'articles'
id = Column(INTEGER,
primary_key=True)
title = Column(String(255), nullable=False, index=True)
content = Column(Text)
user_id = Column(INTEGER, ForeignKey('user_2.id'))
#author =
relationship('User')
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.title)
# 多对多
class User_3(base):
__tablename__ = 'user_3'
id = Column(INTEGER,
primary_key=True, autoincrement=True)
name = Column(String(64))
group = Column(INTEGER, ForeignKey('group.id'))
department = Column(INTEGER,
ForeignKey('department.id'))
password = Column(String(64))
class Group(base):
__tablename__ = 'group'
id = Column(INTEGER,
primary_key=True)
name = Column(String(64), unique=True, nullable=True)
class Department(base):
__tablename__ = 'department'
id = Column(INTEGER,
primary_key=True, autoincrement=True)
hostname = Column(String(64), unique=True, nullable=True)
port = Column(INTEGER, default=22)
#base.metadata.drop_all(engine)
base.metadata.create_all(engine)
result = session.execute('show tables')
#print(result.fetchall())
# 基本的表创建完成了,下面是数据操作
# create
'''
new_obj = User(id='wefsfwe', name='sfd')
session.add(new_obj)
session.add_all([User(id='wef', name='wef')
,User(id='wgeer',name='ergrth')])
session.commit()
'''
result = session.query(User).all()
# print(result)
# read
result = session.query(User).all() # 返回User对象列表
result = session.query(User.id, User.name).all() # 返回tuple列表
result = session.query(User).filter_by(name='wef').all() # 返回User对象列表
result = session.query(User).filter_by(name='wef').first()
#同上
print(result)
for _ in session.query(User).order_by(User.id):
#print(_.id, _.name)
pass
result = session.query(User).filter_by(id=r'6').first()
#print(result)
# update
session.query(User).filter(User.id == 'wef').update({'name':'32345'})
result = session.query(User.id, User.name).all() # 返回tuple列表
#print(result)
# 注意,无论是否提交,查询结果都已改变,但不提交数据库中的数据不会变
session.commit()
# delete
session.query(User).filter(User.id == 'wef').delete()
result = session.query(User.id, User.name).all() # 返回tuple列表
print(result)
# 同样,注意提交
session.commit()
result = session.query(User.id, User.name).all() # 返回tuple列表
print(result)
# 其它
# 条件查询
"""
# 条件
ret = session.query(Users).filter_by(name='alex').all()
ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.between(1, 3), Users.name ==
'eric').all()
ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()
ret =
session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
from sqlalchemy import and_, or_
ret = session.query(Users).filter(and_(Users.id > 3, Users.name ==
'eric')).all()
ret = session.query(Users).filter(or_(Users.id < 2, Users.name ==
'eric')).all()
ret = session.query(Users).filter(
or_(
Users.id < 2,
and_(Users.name == 'eric',
Users.id > 3),
Users.extra != ""
)).all()
# 通配符
ret = session.query(Users).filter(Users.name.like('e%')).all()
ret = session.query(Users).filter(~Users.name.like('e%')).all()
# 限制
ret = session.query(Users)[1:2]
# 排序
ret = session.query(Users).order_by(Users.name.desc()).all()
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()
# 分组
from sqlalchemy.sql import func
ret = session.query(Users).group_by(Users.extra).all()
ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).all()
ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).having(func.min(Users.id)
>2).all()
# 连表
ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()
ret = session.query(Person).join(Favor).all()
ret = session.query(Person).join(Favor, isouter=True).all()
# 组合
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union(q2).all()
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union_all(q2).all()
"""
笔记-ORM-sqlalchemy的更多相关文章
- 20.Python笔记之SqlAlchemy使用
Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...
- python ORM - sqlalchemy 操作使用
python操作数据库 使用 ORM - sqlalchemy,pymsql 安装: pip install pymsq pip install sqlalchemy 一. '''连接数据库''' ...
- tornado 06 数据库—ORM—SQLAlchemy——基本内容及操作
tornado 06 数据库—ORM—SQLAlchemy——基本内容及操作 一. ORM #在服务器后台,数据是要储存在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办?是不 ...
- tornado 07 数据库—ORM—SQLAlchemy—查询
tornado 07 数据库—ORM—SQLAlchemy—查询 引言 #上节课使用query从数据库查询到了结果,但是query返回的对象是直接可用的吗 #在query.py内输入一下内容 from ...
- 【tips】ORM - SQLAlchemy操作MySQL数据库
优先(官方文档SQLAlchemy-version1.2): sqlalchemy | 作者:斯芬克斯 推荐一(长篇幅version1.2.0b3):python约会之ORM-sqlalchemy | ...
- python 学习笔记十一 SQLALchemy ORM(进阶篇)
SqlAlchemy ORM SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据A ...
- 冰冻三尺非一日之寒-mysql(orm/sqlalchemy)
第十二章 mysql ORM介绍 2.sqlalchemy基本使用 ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似pyt ...
- Python开发【十二章】:ORM sqlalchemy
一.对象映射关系(ORM) orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却 ...
- mysql学习笔记(sqlalchemy安装及简单使用)
博主最近在研究接口API自动化测试,之前设计的通过excel来实现自动化测试的框架实际使用中还是有很多局限性 这次博主的思路是: 1 搭建接口API管理平台 支持数据库方便维护 2 自动化测试平台可直 ...
- ORM SQLAlchemy - 对象关联
>>> from sqlalchemy import Column, Integer, String >>> class User(Base): ... __tab ...
随机推荐
- linux 封禁ip
可以直接服务配置nginx.conf 添加 deny+IP 例如: 封禁单个IP deny 106.5.76.83; #封整个段即从123.0.0.1到123.255.255.254的命令deny 1 ...
- 栅格那点儿事(四B)---多波段栅格数据的显示
多波段栅格数据的显示 我上面说了这么多,可能有的人会觉得平时也根本用不上.自然,说起影像数据,大家接触到对多的就是最最常见的航片或卫片.对于这种栅格数据呢,大多数的场景下,都只需实现一个效果,就是最接 ...
- 解决javascript四舍五入不准确
function roundFixed(num, fixed) { var pos = num.toString().indexOf('.'), decimal_places = num.toStri ...
- Linux与Windows区别——总结中
一:在Linux系统中,每一个文件都多加了很多的属性进来,尤其是用户组的概念 二:Windows下面一个文件是否具有执行的能力是通过“扩展名”来判断的,如:.exe,.bat,.com等 Linux下 ...
- mouse事件在JQ中的应用(在动画与交互中用得比较多).
mousedown与mouseup事件 用户交互操作中,最简单直接的操作就是点击操作,因此jQuery提供了一个mousedown的快捷方法可以监听用户鼠标按下的操作,与其对应的还有一个方法mouse ...
- selenium使用谷歌浏览器自带手机模拟器运行H5网页
背景:最开始用手机模拟H5页面跑自动化,发现经常因为app连接或者网络原因等一系列情况,导致M版(H5页面)用例跑不通,想通过浏览器自带的手机模拟器运行,保证稳定性 浏览器自带的模拟器如下图: 代码实 ...
- bpclntcmd一条神奇的命令,解决新安装nbu客户端无法连接的问题 (屡试不爽神命令)
1. bpclntcmd案例 bpclntcmd -clear_host_cache bpclntcmd – 测试 NetBackup 系统的功能,并在 NetBackup 客户端上启用光纤传输服务 ...
- c++参数传递的三种方式
一般来说C++中参数传递有三种方式:值传递.指针传递.引用传递 1.值传递——传值 值传递是最常见的一种参数传递的方式,但是对初学者来说也最容易出错.如下例: #include<iostream ...
- hadoop中使用的Unsafe.java
今天查看hadoop源代码, 发现有个Unsafe.java 稍微总结下 优势 1 减少线程调度开销, Unsafe.java 通过采用非堵塞原子方式来减少线程调度开销 2 传统线程通信 ...
- atoi简析
原文链接 atoi()函数的功能:将字符串转换成整型数:atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将 ...