SQLAlchemy笔记

SQLAlchemy

pip install sqlalchemy

pip install mysqlclient

pip show sqlalchemy

Name: SQLAlchemy

Version: 2.0.46

连接数据库
python 复制代码
import sqlalchemy

engine = sqlalchemy.create_engine("mysql://root:123456@192.168.200.130/test_db")
conn = engine.connect()
print("conn: \n{}".format(conn))
"""
conn: 
<sqlalchemy.engine.base.Connection object at 0x0000019F03B724A0>
"""
查询表
python 复制代码
import sqlalchemy

engine = sqlalchemy.create_engine("mysql://root:123456@192.168.200.130/test_db")
conn = engine.connect()

query = sqlalchemy.text("SELECT * FROM tb_students")
result_sets = conn.execute(query)
for row in result_sets:
    print("row: \n{}".format(row))

"""
row: 
(1, 'John Smith', 'Male', '13800138001')
row: 
(2, 'Jane Doe', 'Female', '13800138002')
row: 
...
row: 
(9, 'Matthew Taylor', 'Male', '13800138009')
row: 
(10, 'Ashley Anderson', 'Female', '13800138010')
"""

conn.close()
engine.dispose()
创建表
python 复制代码
from sqlalchemy import (
    create_engine,
    MetaData,
    Table,
    Column
)

engine = create_engine("mysql://root:123456@192.168.200.130/test_db", echo=True)  # echo表示输出操作过程回显
meta_data = MetaData()

tb_new1 = Table(
    "tb_new1",  # 表名
    meta_data,
    Column("id", sqlalchemy.Integer, primary_key=True),  # id字段,主键
    Column("name", sqlalchemy.String(16), unique=True, nullable=False),  # name字段,16位长,唯一非空
    Column("birthday", sqlalchemy.Date, nullable=True),  # birthday字段,日期类型,可空
)

meta_data.create_all(engine)
"""
2026-02-09 18:24:04,510 INFO sqlalchemy.engine.Engine SELECT DATABASE()
2026-02-09 18:24:04,511 INFO sqlalchemy.engine.Engine [raw sql] ()
2026-02-09 18:24:04,512 INFO sqlalchemy.engine.Engine SELECT @@sql_mode
2026-02-09 18:24:04,513 INFO sqlalchemy.engine.Engine [raw sql] ()
2026-02-09 18:24:04,514 INFO sqlalchemy.engine.Engine SELECT @@lower_case_table_names
2026-02-09 18:24:04,514 INFO sqlalchemy.engine.Engine [raw sql] ()
2026-02-09 18:24:04,515 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2026-02-09 18:24:04,516 INFO sqlalchemy.engine.Engine DESCRIBE `test_db`.`tb_new1`
2026-02-09 18:24:04,516 INFO sqlalchemy.engine.Engine [raw sql] ()
2026-02-09 18:24:04,519 INFO sqlalchemy.engine.Engine 
CREATE TABLE tb_new1 (
	id INTEGER NOT NULL AUTO_INCREMENT, 
	name VARCHAR(16) NOT NULL, 
	birthday DATE, 
	PRIMARY KEY (id), 
	UNIQUE (name)
)


2026-02-09 18:24:04,520 INFO sqlalchemy.engine.Engine [no key 0.00082s] ()
2026-02-09 18:24:04,533 INFO sqlalchemy.engine.Engine COMMIT
"""

conn.close()
engine.dispose()
增加一条记录
python 复制代码
from sqlalchemy import (
    create_engine,
    MetaData,
    Table,
    Column
)

engine = create_engine("mysql://root:123456@192.168.200.130/test_db", echo=True)  # echo表示输出操作过程回显
meta_data = MetaData()

tb_new1 = Table(
    "tb_new1",  # 表名
    meta_data,  
    Column("id"),  # id字段,主键
    Column("name"),  # name字段,16位长,唯一非空
    Column("birthday"),  # birthday字段,日期类型,可空
)

tb_new1_insert = tb_new1.insert()
print("tb_new1_insert: \n{}".format(tb_new1_insert))
"""
tb_new1_insert: 
INSERT INTO tb_new1 (id, name, birthday) VALUES (:id, :name, :birthday)
"""

insert_tom = tb_new1_insert.values(name="李四", birthday="2000-10-11")
print("insert_tom: \n{}".format(insert_tom))
"""
insert_tom: 
INSERT INTO tb_new1 (name, birthday) VALUES (:name, :birthday)
"""

with engine.connect() as conn:
    result = conn.execute(insert_tom)
    print("result.inserted_primary_key: \n{}".format(result.inserted_primary_key))
    """
    result.inserted_primary_key: 
    (1,)
    """
    conn.commit()
"""
2026-02-09 18:32:57,771 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2026-02-09 18:32:57,773 INFO sqlalchemy.engine.Engine INSERT INTO tb_new1 (name, birthday) VALUES (%s, %s)
2026-02-09 18:32:57,773 INFO sqlalchemy.engine.Engine [generated in 0.00094s] ('张三', '2000-10-10')
2026-02-09 18:32:57,775 INFO sqlalchemy.engine.Engine COMMIT
"""

conn.close()
engine.dispose()
增加多条记录
python 复制代码
from sqlalchemy import (
    create_engine,
    MetaData,
    Table,
    Column
)

engine = create_engine("mysql://root:123456@192.168.200.130/test_db", echo=True)  # echo表示输出操作过程回显
meta_data = MetaData()

tb_new1 = Table(
    "tb_new1",  # 表名
    meta_data,  
    Column("id"),  # id字段,主键
    Column("name"),  # name字段,16位长,唯一非空
    Column("birthday"),  # birthday字段,日期类型,可空
)

tb_new1_insert = tb_new1.insert()
with engine.connect() as conn:
    conn.execute(tb_new1_insert, [
        {"name": "user1", "birthday": "2000-1-1"},
        {"name": "user2", "birthday": "2000-1-2"},
        {"name": "user3", "birthday": None}
    ])
    conn.commit()
"""
2026-02-09 18:44:03,088 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2026-02-09 18:44:03,089 INFO sqlalchemy.engine.Engine INSERT INTO tb_new1 (name, birthday) VALUES (%s, %s)
2026-02-09 18:44:03,089 INFO sqlalchemy.engine.Engine [cached since 73.79s ago] [('user1', '2000-1-1'), ('user2', '2000-1-2'), ('user3', None)]
2026-02-09 18:44:03,090 INFO sqlalchemy.engine.Engine COMMIT
"""

conn.close()
engine.dispose()
查询所有记录
python 复制代码
from sqlalchemy import (
    create_engine,
    MetaData,
    Table,
    Column
)

engine = create_engine("mysql://root:123456@192.168.200.130/test_db")  # echo表示输出操作过程回显
meta_data = MetaData()

tb_new1 = Table(
    "tb_new1",  # 表名
    meta_data,  
    Column("id"),  # id字段,主键
    Column("name"),  # name字段,16位长,唯一非空
    Column("birthday"),  # birthday字段,日期类型,可空
)

with engine.connect() as conn:
    query = tb_new1.select()
    result_set = conn.execute(query)

    # 循环提取
    # for row in result_set:
    #     # 第一种方式
    #     print("方法一: \n{}".format(row[0]))
    #     # 第二种方式
    #     print("方法二: \n{}".format(row.name))
        
    # 使用提取函数
    # # 第三种方式
    # result = result_set.fetchall()
    # print("方法三: \n{}".format(result))
    row = result_set.fetchone()
    print("方法四: \n{}".format(row))
"""
方法一: 
1
方法二: 
...
方法一: 
8
方法二: 
user3
方法三: 
[(1, '张三', datetime.date(2000, 10, 10)), (2, '李四', datetime.date(2000, 10, 11)), (6, 'user1', datetime.date(2000, 1, 1)), (7, 'user2', datetime.date(2000, 1, 2)), (8, 'user3', None)]
方法四: 
(1, '张三', datetime.date(2000, 10, 10))
"""
    
conn.close()
engine.dispose()
条件查询
python 复制代码
from sqlalchemy import (
    create_engine,
    MetaData,
    Table,
    Column
)

engine = create_engine("mysql://root:123456@192.168.200.130/test_db")  # echo表示输出操作过程回显
meta_data = MetaData()

tb_new1 = Table(
    "tb_new1",  # 表名
    meta_data,  
    Column("id"),  # id字段,主键
    Column("name"),  # name字段,16位长,唯一非空
    Column("birthday"),  # birthday字段,日期类型,可空
)

with engine.connect() as conn:
    query = tb_new1.select().where(tb_new1.c.birthday > "2000-9-1")
    result_set = conn.execute(query)

    result = result_set.fetchall()
    print("result: \n{}".format(result))

"""
result: 
[(1, '张三', datetime.date(2000, 10, 10)), (2, '李四', datetime.date(2000, 10, 11))]
"""

with engine.connect() as conn:
    query = tb_new1.select().where(tb_new1.c.birthday > "2000-9-1").where(tb_new1.c.id < 2)
    result_set = conn.execute(query)

    result = result_set.fetchall()
    print("result: \n{}".format(result))

"""
result: 
[(1, '张三', datetime.date(2000, 10, 10))]
"""

from sqlalchemy.sql import and_, or_
with engine.connect() as conn:
    query = tb_new1.select().where(
        or_(  # 或条件
            tb_new1.c.name == "user3",
            and_(  # 与条件
                tb_new1.c.birthday > "2000-9-1",
                tb_new1.c.id < 2
            )
        )
    )
    result_set = conn.execute(query)
    result = result_set.fetchall()
    print("result: \n{}".format(result))

"""
result: 
[(1, '张三', datetime.date(2000, 10, 10)), (8, 'user3', None)]
"""

conn.close()
engine.dispose()
相关推荐
顾林海4 小时前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱6 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽11 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码11 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱21 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵1 天前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio1 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户0332126663671 天前
使用 Python 从零创建 Word 文档
python
Csvn1 天前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate