Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQLAlchemy简单入门

SQLAlchemy简单入门

作者头像
若与
发布于 2018-04-25 03:51:33
发布于 2018-04-25 03:51:33
2.1K00
代码可运行
举报
运行总次数:0
代码可运行
SQlAlchemy简单使用
sqlalchemy介绍

SQLAlchemy的是Python的SQL工具包和对象关系映射器,让应用程序开发人员可以使用上SQL的强大功能和灵活性。 它提供了一套完整的企业级持久化模式,专为高效率和高性能的数据库访问而设计,简单易用用,专门为Python语言而准备。

SQLAlchemy的理念

SQL数据库与对象集合目标不同,它需要关注更大的数据容量与更高的性能;而对象集合则和数据表或数据行的目标不同,它需要更好的数据抽象。 SQLAlchemy设计的目的,就是适配这两个原则。

SQLAlchemy把数据库当作是一个关系型代数引擎,不只是数据表的一个集合。数据行不仅可以从数据表中查询出来,也可以从数据表关联后成形成的逻辑数据表和其他的查询语句结果中进行查询;这些元素可以组合形成更大的数据结构。 SQLAlchemy的表达式语言就是建立在这个核心概念之上的。

SQLAlchemy组件中最有名的是它的对象关系映射器(ORM),是一个提供数据映射器模式的可选组件,利用这个组件,类可以以开放式的多种方式映射到数据库上,允许对象模型的设计和数据库架构的设计,一开始就以分离方式进行各自的开发。实现松耦合的架构.

sqlalchemgy文档

独处

连接数据库
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker


DB_CONNECT_STRING = 'mysql+mysqldb://root:123@localhost/mydb?charset=utf8'
engine = create_engine(DB_CONNECT_STRING)
DB_Session = sessionmaker(bind=engine)
session = DB_Session()

上面的DB_CONNECT_STRING是连接数据库的路径,这个路径也就是database_urls包含了使用的数据库驱动以及数据库的连接信息等.一般格式是:dialect+driver://username:password@host:port/database 下面给出其他形式的数据库连接示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# default
engine = create_engine('postgresql://scott:tiger@localhost/mydatabase')

# psycopg2
engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase')

# pg8000
engine = create_engine('postgresql+pg8000://scott:tiger@localhost/mydatabase')


# default
engine = create_engine('mysql://scott:tiger@localhost/foo')

# mysql-python
engine = create_engine('mysql+mysqldb://scott:tiger@localhost/foo')

# MySQL-connector-python
engine = create_engine('mysql+mysqlconnector://scott:tiger@localhost/foo')

# OurSQL
engine = create_engine('mysql+oursql://scott:tiger@localhost/foo')
直接操作sql
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sql= 'show tables'
session.execute(sql)
result = session.excute(sql).fetchall()

sql = 'create database test'
session.excute(sql)

以上使用sqlalchemy直接执行sql语句,这和mysql-python没有任何区别.当然,需要注意在事务操作中,记得commit.在操作很复杂的sql语句,不能映射到对应的ORM上,这是备用选项.

下面开始介绍sqlalchemy的ORM.从数据库的增删查改.

关联一个数据表
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer

engine = create_engine('mysql+mysqldb://root:youdi@localhost:3306/alchemy?charset=utf8')
Base = declarative_base()

class User(Base):

    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column('username',String(64), nullable=False)
    password = Column(String(64), nullable=False)

    email = Column(String(64), nullable=False)

    def __repr__(self):
        return '%s(%r)' % (self.__class__.__name__, self.username)
插入数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import User
from sqlalchemy.orm import sessionmaker
session = sessionmaker(bind=engine)
mysql = session()

user1 = User()
user1.id = 2
user1.name = 'hello'
user1.email = '123@gmail.net'
user1.password = 'password'

mysql.add(user1)

user2 = User(id=3,name='youmi',password='1234',email='12@you.net')

mysql.add(user2)

mysql.commit()

上面插入了两条数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select * from users;
+----+----------+----------+---------------+
| id | username | password | email         |
+----+----------+----------+---------------+
|  2 | hello    | password | 123@gmail.net |
|  3 | youmi    | 1234     | 12@you.net    |
+----+----------+----------+---------------+
2 rows in set (0.02 sec)
查询表中的数据
1.查询所有的数据

如同select * from tb_name

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
query = mysql.query(User)
sql = str(query) # 执行的sql语句
sql = query.statement # 执行的sql语句

users_name = []
for i in query:  #遍历时查询
    users_name.append(i.name)

query.all() #返回所有对象的列表
query.first() #返回第一个对象,记录不存在时,first() 会返回 None
query.one()  # 不存在,或有多行记录时会抛出异常

另外,query也可以使用User直接获得
query = User.query
2.显示指定字段的数据

如同: select name,id from users

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
names = mysql.query(User.name)
names.all() #每行都是一个元组
3.筛选条件

limit

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql.query(User).limit(10)
User.query.limit(10)

offset

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
offset = 10
mysql.query(User).offset(offset).limit(10)
# or
User.query.offset(offset).limit(10)

oder by

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql.query(User).order_by('id')
mysql.query(User).order_by(User.id.desc())
mysql.query(User).order_by('id asc')
mysql.query(User).order_by(User.name.desc(),User.id)

filter sql中的where后面的条件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql.query(User).filter(User.id == 1).scalar()
# or 使用字面量
mysql.query(User).filter('id = 1').scalar()
# 多个条件
mysql.query(User).filter(User.id > 1,User.name != 'youmi').scalar()
# in条件
mysql.query(User).filter(User.id.in_((1,2,3))).scalar()

# or条件需要导入or_()函数
mysql.query(User).filter(or_(User.id > 1,User.name != 'youmi')).scalar()

补充(所有的额外函数): 其中func映射到sql中的很多函数,如:count,sum,now,current_timestamp,md5等等, 其他的函数,有case对应sql中when case

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from .sql import (
    alias,
    and_,
    asc,
    between,
    bindparam,
    case,
    cast,
    collate,
    delete,
    desc,
    distinct,
    except_,
    except_all,
    exists,
    extract,
    false,
    func,
    insert,
    intersect,
    intersect_all,
    join,
    literal,
    literal_column,
    modifier,
    not_,
    null,
    or_,
    outerjoin,
    outparam,
    over,
    select,
    subquery,
    text,
    true,
    tuple_,
    type_coerce,
    union,
    union_all,
    update,
    )
4.联表查询(join)

INNER JOIN

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
query = User.query.join(Group, User.gid == Group.id)
.filter(User.id != None,"is_superuser & 1 = 1")
.order_by(User.last_edit.asc()).limit(10)

LEFT JOIN

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
query = User.query.outerjoin(Group, User.gid == Group.id)
.filter(User.id != None,"is_superuser & 1 = 1")
.order_by(User.last_edit.asc()).limit(10)

RIGHT JOIN

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
query = User.query.outerjoin(Group, User.gid == Group.id)
.filter(User.id != None,"is_superuser & 1 = 1")
.order_by(User.last_edit.asc()).limit(10)

其他的连接方式,需要自己指定参数,可以灵活的操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def join(self, right, onclause=None, isouter=False, join_to_left=None):
        return _ORMJoin(self, right, onclause, isouter)

    def outerjoin(self, right, onclause=None, join_to_left=None):
        return _ORMJoin(self, right, onclause, True)
修改数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql.query(User).filter(User.id == 1).update({User.name:'youmi'})

# or 
user = mysql.query(User).filter(User.id == 1)
user.name = 'test'
mysql.flush() #写入数据库,但并没有提交
删除数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql.query(User).filter(User.id == 1).delete()
mysql.commit()

心 * 自由

不过相比Django的ORM.sqlalchemy对sql的支持更好. 上面只是简单的介绍了sqlalchemy的增删查改,需要更加深入的特性,可以查看官方文档,或者查看源码.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.04.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于GiF动图你不知道的9件事
 点击上方“LiveVideoStack”关注我们 编译:Alex 2022年3月14日,GIF动图的发明者Steve Wilhite因新冠并发症去世,享年74岁。 GIF 发明者Steve Wilhite(图片来源:Stephen Lovekin/Getty Images for The Webby Awards;Wikipedia) 1987年,Steve Wilhite发明了GIF。那个时候,谁也不曾想到一张小小动图会在日后成为风靡互联网的表情包,出现在人们的日常聊天会话中。 为了纪念Steve
LiveVideoStack
2022/04/01
3770
关于GiF动图你不知道的9件事
探索现代图片格式:从GIF到HEIF,优势与适用场景一览
每个像素所能显示的彩色数为2的8次方,即256种颜色。这种彩色深度适用于较古老的显示设备和简单的图像场景。它在色彩表现方面相对较弱,颜色过渡可能显得不够平滑,导致图像呈现出颗粒感,不适合表现细腻的色彩变化。
linwu
2023/07/27
1K0
探索现代图片格式:从GIF到HEIF,优势与适用场景一览
【多媒体】PNG简介
(本文改自多媒体导论我课上做的演讲)转眼就暑假了,这一篇我在4月份准备写结果写了一半就坑到了现在,也是很真实。
ZifengHuang
2020/07/29
1.9K0
【多媒体】PNG简介
无损压缩鼻祖去世了,没有他就没有今天的Zip、PNG、MP3、PDF……
丰色 发自 凹非寺 量子位 | 公众号 QbitAI 无损压缩鼻祖去世了,享年86岁。 他就是Abraham Lempel,来自以色列的科学家。 正是因为他和同事发明的LZ77/LZ78压缩算法,才有了Zip、GIF、PNG、TIFF、MP3、PDF等直到今天还在流行的文件格式。 他生前曾就职的的以色列理工学院评价他为“学院成立100年来最伟大的研究员之一”,并称很少有科学家“像他一样在技术发展以及我们的日常生活领域中都产生了如此大的影响”。 无数网友为他的离世哀悼。 有人还表示: 我的研究生论文主
量子位
2023/02/23
3510
无损压缩鼻祖去世了,没有他就没有今天的Zip、PNG、MP3、PDF……
位图/矢量图/GIF/PNG/JPEG/WEBP一网打尽
大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder。
前端柒八九
2024/03/07
6630
位图/矢量图/GIF/PNG/JPEG/WEBP一网打尽
GIF/PNG/JPG和WEBP/base64/apng图片优点和缺点整理
阅读目录 GIF(Graphics Interchange Format) PNG(Portable Network Graphics) JPG(Joint Photographic Experts Group) base64 APNG   GIF/PNG/JPG/WEBP/APNG都是属于位图(位图 ,务必区别于矢量图);   GIF/PNG和JPG这三种格式的图片被广泛应用在现今的互联网中,gif曾在过去互联网初期慢速的情况下几乎是做到了大一统的地位,而现如今随着互联网技术应用和硬件条件的提高,png和
逸鹏
2018/04/11
3.4K0
GIF/PNG/JPG和WEBP/base64/apng图片优点和缺点整理
现代图片性能优化及体验优化指南 - 图片类型及 Picture 标签的使用
图片资源,在我们的业务中可谓是占据了非常大头的一环,尤其是其对带宽的消耗是十分巨大的。
Sb_Coco
2023/03/01
1.2K0
现代图片性能优化及体验优化指南 - 图片类型及 Picture 标签的使用
关于webp图片格式初探
前言 不管是 PC 还是移动端,图片一直是流量大头,以苹果公司 Retina 产品为代表的高 PPI 屏对图片的质量提出了更高的要求,如何保证在图片的精细度不降低的前提下缩小图片体积,成为了一个有价值且值得探索的事情。 但如今对于 JPEG、PNG 和 GIF 这些图片格式的优化几乎已经达到了极致, 若想改变现状开辟新局面,便要有釜底抽薪的胆量和气魄,而 Google 给了我们一个新选择:WebP。 对 WebP 的研究缘起于手机 QQ 原创表情商城,由于表情包体积较大,在 2G/3G 的网络环境
xiangzhihong
2018/02/01
5.6K0
关于webp图片格式初探
关于前端中图片的性能优化方案
在本地执行 node index.js 后,将会输出一串的<svg>标签,将其直接放入HTML文件中即可。非常的方便
学前端
2020/04/07
2.1K0
我们是如何记录图片的?
作为 Web 开发者,我们日常需要与各式各样的图片格式打交道,以至于有些知识几乎已经成为常识,比如我们应该都知道 PNG 可以支持透明度,jpg 可以压缩到较低的质量,而 gif 则可以显示动图……但是,你知道这些不同的图片格式是如何产生的、并且演进至今的吗?
Tecvan
2022/12/07
7200
我们是如何记录图片的?
这个开发者易忽略的优化点,腾讯视频竟靠它省上千万元
👉腾小云导读 在互联网行业降本增效的大背景下,如何结合业务自身情况降低成本是每个业务都需要思考的问题。腾讯视频业务产品全平台日均覆盖人数超2亿。图片作为流媒体之外最核心的传播介质,庞大的业务量让静态带宽成本一直居高不下——腾讯视频各端日均图片下载次数超过 100 亿次,平均图片大小超 100kb,由此带来的图片静态带宽成本月均超千万。本文将详细介绍腾讯视频业务产品借助腾讯云数据万象来优化静态带宽成本过程中的挑战与解决方案,输出同领域通用的经验方法,希望可以对广大开发爱好者有所启发。 👉看目录,点收藏 1 背
云存储
2023/03/29
7610
这个开发者易忽略的优化点,腾讯视频竟靠它省上千万元
每个前端工程师都应该了解的图片知识(长文建议收藏)
随着web的发展,网站资源的流量也变得越来越大。据统计,60% 的网站流量均来自网站图片,可见对图片合理优化可以大幅影响网站流量,减小带宽消耗和服务器压力。
桃翁
2019/05/31
1.5K0
BMP、GIF、TIFF、PNG、JPG和SVG格式图像的特点
一张图片可以储存为多种格式,为什么有的几十KB,有的几百MB,有的静止不动,有的是好几个画面循环播放?在项目开发的过程中经常会读取或保存图像文件,不同类型的图像特点不同,适用的范围也不同,简要介绍BMP、GIF、TIFF、PNG、JPG和SVG格式图像的特点。
不脱发的程序猿
2021/01/20
5K0
图片格式:JPG;RAW ;TIFF;PNG;GIF的解析
这期我们就来给大家全方位解析常用的图片格式:JPG;RAW ;TIFF;PNG;GIF
狼啸风云
2021/03/03
5.2K0
JPEG/Exif/TIFF格式解读(1):JEPG图片压缩与存储原理分析
JPEG的全称是JointPhotographicExpertsGroup(联合图像专家小组),它是一种常用的图像存储格式, jpg/jpeg是24位的图像文件格式,也是一种高效率的压缩格式,文件格式是JPEG(联合图像专家组)标准的产物,该图像压缩标准是国际电信联盟(International Telecommunication Union,ITU)、国际标准化组织(International Organization for Standardization,ISO)和国际电工委员会(International Electrotechnical Commission,IEC)共同制定。JPEG标准正式地称为ISO/IEC IS(国际标准)10918-1:连续色调静态图像数字压缩和编码(Digital Compression and Coding of Continuous-tone Still Images)和ITU-T建议T.81。
周陆军
2020/07/24
3.9K0
常见图片格式了解 前言概念了解图片类型图片比较与场景应用一图胜前言总结引用 & 参考
作为一个客户端开发,对于图片格式一直没有一个清晰的了解,这里简单的罗列出各种图片格式的区别,文章中有部分是他人的引用,会在底部放上链接,望轻喷。
菜的黑人牙膏
2019/03/19
1.2K0
前端图片优化机制
IMWeb前端团队
2017/12/28
3.3K0
前端图片优化机制
动态图片技术 : 历史、格式与性能
本文介绍了动态图片编码、解码、格式、性能和应用场景方面的知识,并给出了详细的对比结果。
QQ音乐技术团队
2017/09/21
4.1K0
动态图片技术 : 历史、格式与性能
【说站】ps文件格式
Photoshop 格式 (PSD) 是默认的文件格式,扩展名为“.psd”,而且是除大型文档格式 (PSB) 之外支持所有 Photoshop 功能的唯一格式。
很酷的站长
2022/11/24
1.6K0
【说站】ps文件格式
全面掌握移动端主流图片格式的特点、性能、调优等
图片通常是移动端应用流量耗费最多的部分,并且占据着重要的视觉空间。以大家最常用的即时通讯IM应用为例,应用中存在大量的图片数据往来(比如图片消息、用户相册、用户头像等等)。合理的图片格式选用和优化不仅能减小图片传递过程中的数据量、提升视觉效果,还能显著降低服务端的带宽、计算资源等基础设施成本,一举多得。
JackJiang
2018/08/29
2K0
推荐阅读
相关推荐
关于GiF动图你不知道的9件事
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验