百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

Python SQLAlchemy(www.python.org)

sinye56 2024-10-18 12:55 10 浏览 0 评论

1 简介

SQLAlchemy 是一个使用 Python 实现的 ORM 框架,它的设计理念是:SQL 数据库的量级和性能比对象集合重要,对象集合的抽象比表和行重要;它采用了类似于 Java 里 Hibernate 的数据映射模型;它的目标是提供能兼容众多数据库(如:SQLite、MySQL、Postgres、Oracle、MS-SQL、SQLServer 和 Firebird)的企业级持久性模型。

上面提到了 ORM,那 ORM 是什么?ORM 全称 Object Relational Mapping,中文译为对象关系映射,简单的说就是在数据库与业务实体对象之间建立了一种对应关系,我们可以用操作实体对象的方式来完成数据库的操作,ORM 封装了数据库操作,我们无需关心底层数据库是什么,也不用关心 SQL 语言,只需与数据对象交互即可。

2 使用

SQLAlchemy 可以支持多种数据库,本文我们以 SQLite 例,其他数据库也会做一些简单介绍。

2.1 安装

在使用 SQLAlchemy 之前,我们首先要进行安装,使用 pip install sqlalchemy 即可。安装好后看一下版本,如下所示:

>>> import sqlalchemy
>>> sqlalchemy.__version__
'1.3.11'

2.2 创建连接

具体操作之前先看一下 SQLAlchemy Engine(引擎),如图所示:

SQLAlchemy 通过 Engine 来驱动,从图中可以看出 Engine 内维护了一个连接池(Pool)和方言(Dialect),Pool 就是用来存放连接的,Dialect 是用来判断要连接的是哪种数据库,我们创建连接要先创建 Engine,然后再通过 Engine 来创建连接。

2.2.1 SQLite

我们先来看一下如何创建 Engine,几种创建方式如下所示:

相对路径方式

engine = create_engine('sqlite:///foo.db')

绝对路径方式

# Unix/Mac
engine = create_engine('sqlite:////absolute/path/to/foo.db')

# Windows
engine = create_engine('sqlite:///C:\path\to\foo.db')

# Windows 另一种写法
engine = create_engine(r'sqlite:///C:\path\to\foo.db')

创建内存数据库

SQLite 可以创建内存数据库,其他数据库不可以。

engine = create_engine('sqlite://')

以相对路径方式为例,看一下实现示例:

from sqlalchemy import create_engine

# 创建 Engine
engine = create_engine('sqlite:///foo.db', echo=True)
# 创建连接
conn = engine.connect()

echo=True 会将执行语句打印出来,默认为 False;数据库(foo.db)不存在会自动创建。

2.2.2 其他数据库

MySQL

在使用之前要进行第三库的安装,使用 pip install mysqlclient 和 pip install pymysql 即可。

创建 Engine 方式如下所示:

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

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

# PyMySQL
engine = create_engine('mysql+pymysql://scott:tiger@localhost/foo')

使用示例如下所示:

from sqlalchemy import create_engine

engine = create_engine('mysql://root:root@localhost:3306/mysql',
                       echo=True,
                       pool_size=10,
                       pool_recycle=3600)
conn = engine.connect()

参数说明如下所示:

  • echo:值为 True 将执行语句打印出来,默认为 False。
  • pool_size:连接池的大小,默认为 5,0 表示连接数无限制。
  • pool_recycle:设置了 pool_recycle 后,SQLAlchemy 会在指定时间内回收连接,单位为秒。

Oracle

创建 Engine 方式如下所示:

engine = create_engine('oracle://scott:tiger@127.0.0.1:1521/sidname')

engine = create_engine('oracle+cx_oracle://scott:tiger@tnsname')

PostgreSQL

创建 Engine 方式如下所示:

# 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')

SQL Server

创建 Engine 方式如下所示:

# pyodbc
engine = create_engine('mssql+pyodbc://scott:tiger@mydsn')

# pymssql
engine = create_engine('mssql+pymssql://scott:tiger@hostname:port/dbname')

2.3 创建表

表的创建通过映射类的方式实现,首先创建映射基类,后面的类需要继承它,如下所示:

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

创建具体映射类,如下所示:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

engine = create_engine('sqlite:///foo.db', echo=True)
# 映射基类
Base = declarative_base()
# 具体映射类
class SysUser(Base):
    # 指定映射表名
    __tablename__ = 'sys_user'

    # id 设置为主键
    id = Column(Integer, primary_key=True)
    # 指定 name 映射到 name 字段
    name = Column(String(30))
    password = Column(String(32))

# 创建表
Base.metadata.create_all(engine)

执行完成后表就自动为我们创建好了,我们通过 SQLiteStudio 查看一下,结果如图所示:

2.4 建立会话

具体的操作需要使用 session,创建方式如下所示:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///foo.db', echo=True)
Session = sessionmaker(bind=engine)
# 创建 Session 类实例
session = Session()

2.5 基本操作

2.5.1 新增

我们先新增一条数据,如下所示:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///foo.db', echo=True)
# 映射基类
Base = declarative_base()
# 具体映射类
class SysUser(Base):
    # 指定映射表名
    __tablename__ = 'sys_user'

    # id 设置为主键
    id = Column(Integer, primary_key=True)
    # 指定 name 映射到 name 字段
    name = Column(String(30))
    password = Column(String(32))
Session = sessionmaker(bind=engine)
# 创建 Session 类实例
session = Session()
# 新增
su = SysUser(id=1, name='Jhon', password='123456')
# 保存
session.add(su)
# 提交
session.commit()
# 关闭
session.close()

2.5.2 查询

查询操作如下所示:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///foo.db', echo=True)
# 映射基类
Base = declarative_base()
# 具体映射类
class SysUser(Base):
    # 指定映射表名
    __tablename__ = 'sys_user'

    # id 设置为主键
    id = Column(Integer, primary_key=True)
    # 指定 name 映射到 name 字段
    name = Column(String(30))
    password = Column(String(32))
Session = sessionmaker(bind=engine)
# 创建 Session 类实例
session = Session()
# 查询一条数据,filter 相当于 where 条件
u = session.query(SysUser).filter(SysUser.id==1).one()
# 查询所有数据
# session.query(SysUser).filter(SysUser.id==1).all()
print('name-->', u.name)

2.5.3 修改

我们将 id=1 这条数据的 name 修改一下,如下所示:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///foo.db', echo=True)
# 映射基类
Base = declarative_base()
# 具体映射类
class SysUser(Base):
    # 指定映射表名
    __tablename__ = 'sys_user'

    # id 设置为主键
    id = Column(Integer, primary_key=True)
    # 指定 name 映射到 name 字段
    name = Column(String(30))
    password = Column(String(32))
Session = sessionmaker(bind=engine)
# 创建 Session 类实例
session = Session()
u = session.query(SysUser).filter(SysUser.id==1).one()
print('修改前名字-->', u.name)
u.name = 'James'
session.commit()
print('修改后名字-->', u.name)

2.5.4 删除

我们将 id=1 这条数据删除,如下所示:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///foo.db', echo=True)
# 映射基类
Base = declarative_base()
# 具体映射类
class SysUser(Base):
    # 指定映射表名
    __tablename__ = 'sys_user'

    # id 设置为主键
    id = Column(Integer, primary_key=True)
    # 指定 name 映射到 name 字段
    name = Column(String(30))
    password = Column(String(32))
Session = sessionmaker(bind=engine)
# 创建 Session 类实例
session = Session()
u = session.query(SysUser).filter(SysUser.id==1).one()
session.delete(u)
session.commit()

总结

本文介绍了 SQLAlchemy 的基本概念和使用,对 Python 工程师使用 SQLAlchemy 提供了支撑。

相关推荐

6个接私活的网站,你有技术就有钱

如果觉得有帮助,还请大家帮忙多多转发,点个关注作者:发哥链接:GitHubDaily本篇文章会向大家推荐国内外几个接外包比较靠谱的平台,主旨是贵精不贵多。因此,像「猪x戒」这种会让程序员自贬身价,扰乱...

Java开源可商用的CMS建站系统_java建站源码

Java研发的CMS内容管理系统具有许多优势和特点,包括以下几个方面:跨平台性:Java是一种跨平台的编程语言,可以在不同的操作系统上运行,包括Windows、Linux、Mac等。这意味着Java...

SEO新手建站必看"干货"优质空间和功能选择技巧!

一.空间的分类服务器:远程的高级大型计算机。vps:虚拟服务器。虚拟空间:也称虚拟主机云主机:是在一组集群主机上虚拟出多个类似独立主机的部分,集群中每个主机上都有云主机的一个镜像,从而大大提高了虚拟主...

千字长文教你使用 宝塔面板 快速搭建网站

本文将教大家使用宝塔面板快速搭建网站,云服务器购买以及域名注册部分请自行上网搜索了解,亦可留言联系小编进行咨询。如果是和下方一样本地搭建演示的话,则不需要付费购买域名和主机。宝塔面板的是...

BlueHost香港虚拟主机建站的5个优点

应该是从2006年左右开始,如果我们建站选择国内的主机需要备案手续,而且比较繁琐,且根据各地的不同政策还需要到接入点拍照登记个人信息等,一来比较繁琐,二来我们担心万一网站可能存在的信息问题导致不必要的...

10款好用的Linux服务器网站管理面板推荐

如今在建站时,很多人都会使用管理面板来辅助建站,因为相对于手动安装软件,面板更加简单而且高效,即使新手也能很快学会搭建网站,在本文中我们来推荐几款好用的网站管理面板宝塔面板宝塔面板是一款简单好用的网站...

小白拥有一台云服务器到底能干些什么?成就感爆棚的简单方案!

?云服务器是什么?云服务器(比如阿里云、腾讯云等)是提供给用户的一种虚拟服务器资源,你可以把它看作一台“rent的电脑”,只需要支付少量费用就可以拥有一个功能强大的网络设备。对于小白来说,拥有一...

苹果CMS,苹果CMS采集插件,苹果CMS快速建站(图文教程)

苹果CMS,有着强大的管理功能,管理后台界面大方、操作简单、功能齐全、模块众多、双端管理。苹果CMS加上丰富的系统标签,系统内置了丰富的cms标签并支持thinkphp框架标签完美融合,可以调取系统内...

新手搭建网站、小程序、APP等系统,如何选择服务器?

今天和小蔡和大家说说,新手搭建网站,如何选择服务器?废话不多说,直接来干货。服务器是存放网站源代码的容器,也是运行网站程序的工具,所以是不可或缺的。新手刚接触搭建网站,若不知道怎么去选择一台适合自己...

在海外VPS服务器(Hostinger)上配置宝塔面板的操作步骤

不得不说,宝塔面板是真的好用啊~用上就放不下了,一些海外的免费开源的服务器集成面板(比如CloudPanel)我也用了,不喜欢,真的不如宝塔面板方便耐用。今天聊一下在海外服务器(也包括国内服务器,没有...

干货盘点:每个wordpress站长都推荐完成的60个任务清单

构建和运营wordpress网站包含了很多重要任务,遗漏哪一方面都可能造成或大或小的不良后果,因此我们特别整理了这个任务清单,为你查漏补缺,希望能对您现在运营或者即将开始构建的wordpress网站有...

为什么站长喜欢选择BlueHost主机建站

BlueHost正式成立于2003年,从事主机(虚拟主机)业务至今已经将近十余年,无论从口碑还是用户的评价,我们基本很少看到关于Bluehost主机产品和商家负面的评论信息。从2014年开始,Blue...

自助建站时代来临 半小时成建站达人

“H5”意为第五代HTML,即第五代网页编写语言。自从1991年第一代HTML开始研发以来,网页编写、网站建设一直都属于高端技术行业,网站建设人员都是一些专业型人才,这也意味着网站的建设和维护都需要不...

现代化、开源的 Linux 服务器运维管理面板

1Panel是一个现代化、开源的Linux服务器运维管理面板。1Panel的功能和优势包括:快速建站:深度集成Wordpress和Halo,域名绑定、SSL证书配置等一键搞定;高效管理...

[1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

测评介绍本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于do...

取消回复欢迎 发表评论: