python学习--SQLAlchemy

这篇博客详细介绍了Python中的ORM框架SQLAlchemy,包括如何安装、创建数据库连接、声明映射、执行CRUD操作以及复杂的查询技巧。通过示例展示了如何创建表、管理会话,并探讨了使用ORM的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ORM

ORM,对象关系映射,对象和关系之间的映射,使用面向对象的方式来操作数据库

关系模型和Python对象之间的映射
table  => class    ,表映射为类
row    => object   ,行映射为实例
column => property ,字段映射为属性

SQLAlchemy

安装

$ pip install sqlalchemy

文档

官方文档 http://docs.sqlalchemy.org/en/latest/
查看版本

import sqlalchemy
print(sqlalchemy.__version__)

开发

SQLAlchemy内部使用了连接池

创建连接

数据库连接的事情,交给引擎

from sqlalchemy import create_engine

dialect+driver://username:password@host:port/database

mysqldb的连接
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
engine = sqlalchemy.create_engine("mysql+mysqldb://test:test@127.0.0.1:3306/test")

pymysql的连接
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
engine = sqlalchemy.create_engine("mysql+pymysql://test:test@127.0.0.1:3306/test")
engine = sqlalchemy.create_engine("mysql+pymysql://test:test@127.0.0.1:3306/test",
echo=True)

echo=True
引擎是否打印执行的语句,调试的时候打开很方便。

lazy connecting:懒连接。创建引擎并不会马上连接数据库,直到让数据库执行任务时才连接。

Declare a Mapping创建映射

创建基类

from sqlalchemy.ext.declarative import declarative_base
# 创建基类,便于实体类继承。SQLAlchemy大量使用了元编程
Base = declarative_base() # 内部实现描述器

创建实体类

student表

CREATE TABLE student (
    id INTEGER NOT NULL AUTO_INCREMENT,
    name VARCHAR(64) NOT NULL,
    age INTEGER,
    PRIMARY KEY (id)
)
from sqlalchemy import Column, Integer, String

# 创建实体类
class Student(Base):
    # 指定表名
    __tablename__ = 'student'
    # 定义类属性对应字段
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)
    age = Column(Integer)
    # 第一参数是字段名,如果和属性名不一致,一定要指定
    # 例如:a = Column('age', Integer)

    def __repr__(self):
        return "{} id={} name={} age={}".format(
            self.__class__.__name__, self.id, self.name, self.age)

# 查看表结构
print(Student)
print(repr(Student.__table__))

# 显示结果
Table('student', MetaData(bind=None),
    Column('id', Integer(), table=<student>, primary_key=True, nullable=False),
    Column('name', String(length=64), table=<student>, nullable=False),
    Column('age', Integer(), table=<student>),
    schema=None)

__tablename__指定表名
Column类指定对应的字段,必须指定, 第一参数是字段名, 如果和属性名一致, 则不需要传参

实例化

s = Student(name='tom')
print(s.name)
s.age = 20
print(s.age)

创建表

可以使用SQLAlchemy来创建、删除表

# 删除继承自Base的所有表
Base.metadata.drop_all(engine)
# 创建继承自Base的所有表
Base.metadata.create_all(engine)

生产环境很少这样创建表,都是系统上线的时候由脚本生成。
生产环境很少删除表,宁可废弃都不能删除

创建会话session

在一个会话中操作数据库,会话建立在连接上,连接被引擎管理。
当第一次使用数据库时,从引擎维护的连接池中获取一个连接使用

# 创建session
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm.session import Session

# Session = sessionmaker(bind=engine) # 工厂方法返回类
session:Session = sessionmaker(bind=engine)() # 实例化
# 依然在第一次使用时连接数据库

session对象线程不安全。所以不同线程应该使用不用的session对象。
Session类和engine有一个就行了

CRUD操作

add():增加一个对象
add_all():可迭代对象,元素是对象

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

# mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

IP = "127.0.0.1" # IP
USERNAME = "test" # 用户名称
PASSWORD = "test" # 用户密码
DBNAME = "test" # 数据库名称
PORT = 3306 # 端口
# 用户名称, 密码, IP, 端口, 数据库名称
# 创建引擎
engine = create_engine("mysql+pymysql://{}:{}@{}:{}/{}".format(
    USERNAME, PASSWORD, IP, PORT, DBNAME
),echo=True) # lazy 懒连接

# Base.metadata.drop_all(engine) # 删除Base管理的所有类对应的表
# Base.metadata.create_all(engine) # 创建Base管理的所有类对应的表

###########################################

# ORM Mapping  创建映射
Base = declarative_base() # 基类

# 内部实现描述器
class Student(Base):
    __tablename__ = "student" # 表名称

    # 定义字段类型和属性
    id = Column(Integer, primary_key=True, autoincrement=True) # 第一个写字段名, 如果字段名和属性名相同, 则省略不写
    name = Column(String(64), nullable=False)
    age = Column(Integer)

    def __repr__(self):
        return "<{} id={}, name={}, age={}>".format(
            __class__.__name__, self.id, self.name, self.age
        )

# 创建会话
from sqlalchemy.orm.session import Session

# Session = sessionmaker(bind=engine) # 绑定engine, 工厂方法返回类
session:Session = sessionmaker(bind=engine)() # 线程不安全

#########################

student = Student(name
### Anaconda 安装教程 #### 一、安装 Anaconda 并配置环境变量 为了确保 Anaconda 正常工作,在安装过程中需要注意勾选添加路径选项,这一步骤对于后续命令行工具的正常使用至关重要[^3]。 ```bash # 如果在安装时未选择添加路径,则可以通过手动设置环境变量来解决 export PATH="/path/to/anaconda/bin:$PATH" ``` #### 二、验证安装是否成功 完成安装后,可通过启动 Anaconda Navigator 或者在命令提示符中运行 `conda --version` 来确认安装情况。如果显示 Conda 的版本号则表示安装无误。 ```bash conda --version ``` ### 使用清华大学镜像加速软件包下载 #### 三、配置 Conda 使用清华大学镜像源 由于官方仓库可能速度较慢,建议修改默认的 Conda 源为清华大学开源软件镜像站提供的国内镜像地址,从而提高依赖项获取效率[^1]。 ```bash # 添加清华镜像作为优先级最高的渠道 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ # 显示完整的 URL 地址以便于调试 conda config --set show_channel_urls yes ``` #### 四、创建并激活 TensorFlow 所需虚拟环境 考虑到不同 Python 版本之间的兼容性差异,推荐专门为 TensorFlow 创建独立的工作空间,并指定合适的 Python 解释器版本[^2]。 ```bash # 基于特定Python版本建立新的Conda环境 conda create -n tensorflow python=3.6 anaconda # 切换至刚创建好的环境中去 conda activate tensorflow ``` #### 五、利用 Pip 和 Conda 结合方式高效部署 TensorFlow 及其他库 除了通过 Conda 管理基础设施外,还可以借助 PyPI 上丰富的第三方扩展资源进一步完善开发平台建设;同样地,这里也提倡采用本地化存储节点以加快网络传输速率[^4]。 ```bash # 运用Pip配合清华简易索引服务器快速加载目标模块 pip install tensorflow-gpu==2.x.y -i https://pypi.tuna.tsinghua.edu.cn/simple ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值