第86天:Python SQLAlchemy


by 程序員野客

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 提供了支撐。

參考:

https://docs.sqlalchemy.org/en/13/orm/tutorial.html

示例代碼:Python-100-days-day086

關注公眾號:python技術,回復"python"一起學習交流


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM