SQLAlchemy ORM 基础
2022年 05月 12 日

子弹

ORM 基础

1. 安装模块

还需要安装数据库驱动,这里安装的是 pymysql,用来驱动 MYSQL 数据库。

pip install sqlalchemy
pip install pymysql

2. 概念和数据类型

2.1 概念

概念对应数据库说明
Engine连接驱动引擎
Session事务由此开始查询
Model
Column类属性
Model()记录Model 类的实例对象

2.2 数据类型

数据类型数据库数据类型Python数据类型说明
Integerintint整型,32位
Stringvarcharstring字符串
Texttextstring长字符串
Floatfloatfloat浮点型
BooleantinyintboolTrue/False
Datedatedatatime.date储存时间年月日
DateTimedatetimedatetime.datetime储存年月日时分秒毫秒等
Timetimedatetime.datetime储存时分秒
JSONJSONJSONJSON 类型

3. 常用包

3.1 create_engine

建立连接-引擎

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://用户名:密码@IP地址:端口号/数据库名')

利用引擎连接 MySQL 数据库

HOST = 'localhost'
PORT = 3306
USERNAME = 'root'
PASSWORD = '123456'
DB = 'myclass'

# dialect + driver://username:passwor@host:port/database
DB_URI = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DB}'
engine = create_engine("mysql://user:password@hostname/dbname?charset=utf8",
                       echo=True,
                       pool_size=8,
                       pool_recycle=60*30
                       )
  • echo: 当设置为 True 时会将 ORM 语句转化为 SQL 语句打印,一般 debug 的时候可用
  • pool_size: 连接池的大小,默认为5个,设置为0时表示连接无限制
  • pool_recycle: 设置时间以限制数据库多久没连接自动断开

这个 echo 标志是设置 sqlachemy 日志的快捷方式,它是通过python的标准实现的。 logging 模块。启用它后,我们将看到生成的所有 SQL。如果您正在学习本教程并希望生成的输出更少,请将其设置为 False。 本教程将在弹出窗口后面格式化 SQL,这样它就不会妨碍我们的工作;只需单击 “SQL” 链接查看正在生成的内容。

例如:

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123456@10.13.24.249:3306/database', echo=True)

3.2 declarative_base

声明映射

from sqlalchemy.orm import declarative_base
Base = declarative_base()

以后新建的模型都继承这个类

使用声明性系统映射的类是根据一个基类定义的,该基类维护一个与该基相关的类和表的目录,这称为声明性基类. 我们的应用程序在一个通常导入的模块中通常只有这个基的一个实例。

既然我们有了一个“基”,就可以根据它定义任意数量的映射类。我们从一张叫 users,它将使用我们的应用程序为最终用户存储记录。一个名为 User 将是我们映射此表的类。在类中,我们定义了要映射到的表的详细信息,主要是表名以及列的名称和数据类型:

from sqlalchemy import Column, Integer, String
class User(Base):
    __tablename__ = 'users'  # 表名
    id = Column(Integer, primary_key=True)  # 定义主键
    name = Column(String)
    fullname = Column(String)
    nickname = Column(String)

    def __repr__(self):
        return "<User(name='%s', fullname='%s', nickname='%s')>" % (
                        self.name, self.fullname, self.nickname)

3.3 Column

引入字段

from sqlalchemy import Column

3.4 Integer, String, JSON

引入数据类型

from sqlalchemy import Integer, String, JSON
  • String 类型需要标注长度,例如:String(50)

3.5 ForeignKey

引入外键

from sqlalchemy import ForeignKey

3.6 relationship, backref

引入关系

from sqlalchemy.orm import relationship, backref

3.7 func

引入数据库函数

from sqlalchemy import func

3.8 MYSQL 数据类型

from sqlalchemy.dialects.mysql import \
        BIGINT, BINARY, BIT, BLOB, BOOLEAN, CHAR, DATE, \
        DATETIME, DECIMAL, DECIMAL, DOUBLE, ENUM, FLOAT, INTEGER, \
        LONGBLOB, LONGTEXT, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, NCHAR, \
        NUMERIC, NVARCHAR, REAL, SET, SMALLINT, TEXT, TIME, TIMESTAMP, \
        TINYBLOB, TINYINT, TINYTEXT, VARBINARY, VARCHAR, YEAR

3.9 Session

sqlalchemy 中使用 session 用于创建程序和数据库之间的会话,所有对象的载入和保存都需要通过 session 对象 。

通过 sessionmaker 调用创建一个工厂,并关联 Engine 以确保每个 session 都可以使用该 Engine 连接资源:

from sqlalchemy.orm import sessionmaker

# 创建session
DbSession = sessionmaker(bind=engine)  # 定义一个 Session 类,其中包括了引擎的信息
session = DbSession()  # 通过 Session 类实例化一个 session 对象用来操作数据库

session 的常见操作方法包括:

  • flush:预提交,提交到数据库文件,还未写入数据库文件中
  • commit:提交了一个事务
  • rollback:回滚
  • close:关闭
  • execute : 执行查询语句

可以用上下文管理器来操作 session:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# an Engine, which the Session will use for connection
# resources
engine = create_engine('postgresql://scott:tiger@localhost/')

# a sessionmaker(), also in the same scope as the engine
Session = sessionmaker(engine)

# we can now construct a Session() and include begin()/commit()/rollback()
# at once
with Session.begin() as session:
    session.add(some_object)
    session.add(some_other_object)
# commits the transaction, closes the session

SQLAlchemy ORM 基础

ORM 基础

1. 安装模块

还需要安装数据库驱动,这里安装的是 pymysql,用来驱动 MYSQL 数据库。

pip install sqlalchemy
pip install pymysql

2. 概念和数据类型

2.1 概念

概念对应数据库说明
Engine连接驱动引擎
Session事务由此开始查询
Model
Column类属性
Model()记录Model 类的实例对象

2.2 数据类型

数据类型数据库数据类型Python数据类型说明
Integerintint整型,32位
Stringvarcharstring字符串
Texttextstring长字符串
Floatfloatfloat浮点型
BooleantinyintboolTrue/False
Datedatedatatime.date储存时间年月日
DateTimedatetimedatetime.datetime储存年月日时分秒毫秒等
Timetimedatetime.datetime储存时分秒
JSONJSONJSONJSON 类型

3. 常用包

3.1 create_engine

建立连接-引擎

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://用户名:密码@IP地址:端口号/数据库名')

利用引擎连接 MySQL 数据库

HOST = 'localhost'
PORT = 3306
USERNAME = 'root'
PASSWORD = '123456'
DB = 'myclass'

# dialect + driver://username:passwor@host:port/database
DB_URI = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOST}:{PORT}/{DB}'
engine = create_engine("mysql://user:password@hostname/dbname?charset=utf8",
                       echo=True,
                       pool_size=8,
                       pool_recycle=60*30
                       )
  • echo: 当设置为 True 时会将 ORM 语句转化为 SQL 语句打印,一般 debug 的时候可用
  • pool_size: 连接池的大小,默认为5个,设置为0时表示连接无限制
  • pool_recycle: 设置时间以限制数据库多久没连接自动断开

这个 echo 标志是设置 sqlachemy 日志的快捷方式,它是通过python的标准实现的。 logging 模块。启用它后,我们将看到生成的所有 SQL。如果您正在学习本教程并希望生成的输出更少,请将其设置为 False。 本教程将在弹出窗口后面格式化 SQL,这样它就不会妨碍我们的工作;只需单击 “SQL” 链接查看正在生成的内容。

例如:

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123456@10.13.24.249:3306/database', echo=True)

3.2 declarative_base

声明映射

from sqlalchemy.orm import declarative_base
Base = declarative_base()

以后新建的模型都继承这个类

使用声明性系统映射的类是根据一个基类定义的,该基类维护一个与该基相关的类和表的目录,这称为声明性基类. 我们的应用程序在一个通常导入的模块中通常只有这个基的一个实例。

既然我们有了一个“基”,就可以根据它定义任意数量的映射类。我们从一张叫 users,它将使用我们的应用程序为最终用户存储记录。一个名为 User 将是我们映射此表的类。在类中,我们定义了要映射到的表的详细信息,主要是表名以及列的名称和数据类型:

from sqlalchemy import Column, Integer, String
class User(Base):
    __tablename__ = 'users'  # 表名
    id = Column(Integer, primary_key=True)  # 定义主键
    name = Column(String)
    fullname = Column(String)
    nickname = Column(String)

    def __repr__(self):
        return "<User(name='%s', fullname='%s', nickname='%s')>" % (
                        self.name, self.fullname, self.nickname)

3.3 Column

引入字段

from sqlalchemy import Column

3.4 Integer, String, JSON

引入数据类型

from sqlalchemy import Integer, String, JSON
  • String 类型需要标注长度,例如:String(50)

3.5 ForeignKey

引入外键

from sqlalchemy import ForeignKey

3.6 relationship, backref

引入关系

from sqlalchemy.orm import relationship, backref

3.7 func

引入数据库函数

from sqlalchemy import func

3.8 MYSQL 数据类型

from sqlalchemy.dialects.mysql import \
        BIGINT, BINARY, BIT, BLOB, BOOLEAN, CHAR, DATE, \
        DATETIME, DECIMAL, DECIMAL, DOUBLE, ENUM, FLOAT, INTEGER, \
        LONGBLOB, LONGTEXT, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, NCHAR, \
        NUMERIC, NVARCHAR, REAL, SET, SMALLINT, TEXT, TIME, TIMESTAMP, \
        TINYBLOB, TINYINT, TINYTEXT, VARBINARY, VARCHAR, YEAR

3.9 Session

sqlalchemy 中使用 session 用于创建程序和数据库之间的会话,所有对象的载入和保存都需要通过 session 对象 。

通过 sessionmaker 调用创建一个工厂,并关联 Engine 以确保每个 session 都可以使用该 Engine 连接资源:

from sqlalchemy.orm import sessionmaker

# 创建session
DbSession = sessionmaker(bind=engine)  # 定义一个 Session 类,其中包括了引擎的信息
session = DbSession()  # 通过 Session 类实例化一个 session 对象用来操作数据库

session 的常见操作方法包括:

  • flush:预提交,提交到数据库文件,还未写入数据库文件中
  • commit:提交了一个事务
  • rollback:回滚
  • close:关闭
  • execute : 执行查询语句

可以用上下文管理器来操作 session:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# an Engine, which the Session will use for connection
# resources
engine = create_engine('postgresql://scott:tiger@localhost/')

# a sessionmaker(), also in the same scope as the engine
Session = sessionmaker(engine)

# we can now construct a Session() and include begin()/commit()/rollback()
# at once
with Session.begin() as session:
    session.add(some_object)
    session.add(some_other_object)
# commits the transaction, closes the session

赞 (0)

评论区(暂无评论)

这里空空如也,快来评论吧~

我要评论