前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python ORM框架sqlAlchemy

python ORM框架sqlAlchemy

原创
作者头像
shigen
发布2023-08-18 23:39:01
3880
发布2023-08-18 23:39:01
举报

背景

最近在研究mysql的ORM框架,忽然看到了一个pip的包sqlalchemy,让我觉得很神奇,用下来的感觉和javahibernate差不多,后边的链式查询又让我觉得和我很喜欢用的mybatis plus差不多,于是抱着好奇加上学习的态度,shigen整理了一下sqlalchemy的用法。更多资料,参见sqlalchemy官网

当然,对于sqlalchemymybatis plus使用体验的对比,也欢迎伙伴们留言就留哈。

现在,我们正式进入正题。首先,我们需要安装必要的pip包:

代码语言:shell
复制
pip install sqlalchemy pymysql

使用

  • 导入需要的模块和函数

这里的faker是为了后期的模拟数据使用,这里先透露一下。剩下的导入都和sqlalchemy的函数或包有关,如字段的类型、session的管理器、sql建表语句的生成等。

代码语言:python
复制
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from faker import Faker
  • 创建数据库引擎和会话工厂

这里主要是配置mysql的链接信息,和java连接数据库几乎是一样的。shigen这里就先以我自己本地的数据库为例演示了。我们主要是为了获得session这个会话对象,进而去操作数据库。

代码语言:python
复制
#### 配置数据库信息
username="root"
password="123456"
host="localhost"
database_name="security"
代码语言:python
复制
engine = create_engine(f'mysql+pymysql://{username}:{password}@{host}/{database_name}', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
  • 创建对象基类
代码语言:python
复制
Base = declarative_base()
代码语言:txt
复制
/var/folders/23/cm3_pjkd00s3s4nq8d9jwk6c0000gn/T/ipykernel_66991/4196137762.py:1: MovedIn20Warning: The ``declarative_base()`` function is now available as sqlalchemy.orm.declarative_base(). (deprecated since: 2.0) (Background on SQLAlchemy 2.0 at: https://sqlalche.me/e/b8d9)
代码语言:txt
复制
  Base = declarative_base()

查看对应的数据库结构

代码语言:sql
复制
desc user;
  • 定义User类并继承Base
代码语言:python
复制
class User(Base):
    __tablename__ = 'user'

    id = Column(Integer, primary_key=True)
    username = Column(String(255))
    password = Column(String(255))
    nickname = Column(String(30))
    phone = Column(String(11))
    introduction = Column(String(200))
    avatar = Column(String(300))
    create_time = Column(DateTime)
    update_time = Column(DateTime)

    def __repr__(self):
        return f"<User(id={self.id}, username={self.username}, nickname={self.nickname})>"

    def __str__(self):
        fields = [
            f"ID: {self.id}",
            f"Username: {self.username}",
            f"Password: {self.password}",
            f"Nickname: {self.nickname}",
            f"Phone: {self.phone}",
            f"Introduction: {self.introduction}",
            f"Avatar: {self.avatar}",
            f"Create Time: {self.create_time}",
            f"Update Time: {self.update_time}",
        ]
        return "\n".join(fields)
  • faker模拟数据

有了数据库的映射对象User 我还需要用到faker实现数据的模拟

代码语言:python
复制
from faker import Faker

# 创建Faker对象
fake = Faker('zh_CN')

def fake_user() -> User:
    user = User(
        username=fake.name(),
        password=fake.password(),
        nickname=fake.user_name(),
        phone=fake.phone_number(),
        introduction=fake.text(max_nb_chars=200),
        avatar=fake.image_url(width=None, height=None),
        create_time=fake.date_time_this_decade(),
        update_time=fake.date_time_this_month()
    )
    return user

在这里,先测试一下生成的效果:

代码语言:python
复制
user = fake_user()
user
代码语言:txt
复制
<User(id=None, username=李旭, nickname=junshen)>
  • 创建数据库表,若存在表不会创建

是不是像极了hibernate 的配置,还有spring jpa的配置

代码语言:python
复制
Base.metadata.create_all(engine)
代码语言:txt
复制
2023-08-18 13:25:12,874 INFO sqlalchemy.engine.Engine SELECT DATABASE()
代码语言:txt
复制
2023-08-18 13:25:12,875 INFO sqlalchemy.engine.Engine [raw sql] {}
代码语言:txt
复制
2023-08-18 13:25:12,877 INFO sqlalchemy.engine.Engine SELECT @@sql_mode
代码语言:txt
复制
2023-08-18 13:25:12,877 INFO sqlalchemy.engine.Engine [raw sql] {}
代码语言:txt
复制
2023-08-18 13:25:12,879 INFO sqlalchemy.engine.Engine SELECT @@lower_case_table_names
代码语言:txt
复制
2023-08-18 13:25:12,879 INFO sqlalchemy.engine.Engine [raw sql] {}
代码语言:txt
复制
2023-08-18 13:25:12,880 INFO sqlalchemy.engine.Engine BEGIN (implicit)
代码语言:txt
复制
2023-08-18 13:25:12,880 INFO sqlalchemy.engine.Engine DESCRIBE `security`.`user`
代码语言:txt
复制
2023-08-18 13:25:12,881 INFO sqlalchemy.engine.Engine [raw sql] {}
代码语言:txt
复制
2023-08-18 13:25:12,883 INFO sqlalchemy.engine.Engine COMMIT
  • 插入一条记录
代码语言:python
复制
print(user)
session.add(user)
session.commit()
代码语言:txt
复制
ID: None
代码语言:txt
复制
Username: 李旭
代码语言:txt
复制
Password: &SSI(JmFB3
代码语言:txt
复制
Nickname: junshen
代码语言:txt
复制
Phone: 13760392175
代码语言:txt
复制
Introduction: 科技最新需要简介继续.目前一次中国还有.首页相关他们标准具有所以专业.
代码语言:txt
复制
一直的人国家发展论坛操作简介.一种因此两个介绍就是.
代码语言:txt
复制
来自只要现在孩子自己.一种其实出来软件关于行业登录特别.功能完全增加觉得.
代码语言:txt
复制
不要一直这些您的发布非常人员.参加时候学习作品点击.怎么名称结果发现.政府不过不能次数管理一次操作.
代码语言:txt
复制
的人作品过程客户能够使用空间.自己不同就是经营网络广告如此.最后中心密码但是由于.
代码语言:txt
复制
Avatar: https://placekitten.com/131/293
代码语言:txt
复制
Create Time: 2022-08-31 10:34:55
代码语言:txt
复制
Update Time: 2023-08-18 04:05:30
代码语言:txt
复制
2023-08-18 13:31:41,978 INFO sqlalchemy.engine.Engine INSERT INTO user (username, password, nickname, phone, introduction, avatar, create_time, update_time) VALUES (%(username)s, %(password)s, %(nickname)s, %(phone)s, %(introduction)s, %(avatar)s, %(create_time)s, %(update_time)s)
代码语言:txt
复制
2023-08-18 13:31:41,980 INFO sqlalchemy.engine.Engine [generated in 0.00134s] {'username': '李旭', 'password': '&SSI(JmFB3', 'nickname': 'junshen', 'phone': '13760392175', 'introduction': '科技最新需要简介继续.目前一次中国还有.首页相关他们标准具有所以专业.\n一直的人国家发展论坛操作简介.一种因此两个介绍就是.\n来自只要现在孩子自己.一种其实出来软件关于行业登录特别.功能完全增加觉得.\n不要一直这些您的发布非常人员.参加时候学习作品点击.怎么名称结果发现.政府不过不能次数管理一次操作.\n的人作品过程客户能够使用空间.自己不同就是经营网络广告如此.最后中心密码但是由于.', 'avatar': 'https://placekitten.com/131/293', 'create_time': datetime.datetime(2022, 8, 31, 10, 34, 55), 'update_time': datetime.datetime(2023, 8, 18, 4, 5, 30)}
代码语言:txt
复制
2023-08-18 13:31:41,982 INFO sqlalchemy.engine.Engine COMMIT

可以看到日志里边有写好的sql语句,可以很清楚的看到sql模板语句,和实际的参数信息

  • 查询单条

这也是shigen觉得sqlalchemy设计的巧妙处之一,直接函数的拼接,通过拼接构造查询的sql语句

代码语言:python
复制
session.query(User).filter_by(nickname='junshen').first()
代码语言:txt
复制
2023-08-18 13:32:07,443 INFO sqlalchemy.engine.Engine BEGIN (implicit)
代码语言:txt
复制
2023-08-18 13:32:07,445 INFO sqlalchemy.engine.Engine SELECT user.id AS user_id, user.username AS user_username, user.password AS user_password, user.nickname AS user_nickname, user.phone AS user_phone, user.introduction AS user_introduction, user.avatar AS user_avatar, user.create_time AS user_create_time, user.update_time AS user_update_time 
代码语言:txt
复制
FROM user 
代码语言:txt
复制
WHERE user.nickname = %(nickname_1)s 
代码语言:txt
复制
 LIMIT %(param_1)s
代码语言:txt
复制
2023-08-18 13:32:07,446 INFO sqlalchemy.engine.Engine [cached since 291.8s ago] {'nickname_1': 'junshen', 'param_1': 1}
代码语言:txt
复制
<User(id=9, username=李旭, nickname=junshen)>
  • 查询所有的记录

这里篇幅有限,我就选取分页展示了,现在演示的是查询数据库的第3条数据

代码语言:python
复制
users = session.query(User).offset(2).limit(1).all()
for user in users:
    print(user)
    print('--------------------------------')
代码语言:txt
复制
2023-08-18 23:10:20,170 INFO sqlalchemy.engine.Engine BEGIN (implicit)
代码语言:txt
复制
2023-08-18 23:10:20,174 INFO sqlalchemy.engine.Engine SELECT user.id AS user_id, user.username AS user_username, user.password AS user_password, user.nickname AS user_nickname, user.phone AS user_phone, user.introduction AS user_introduction, user.avatar AS user_avatar, user.create_time AS user_create_time, user.update_time AS user_update_time 
代码语言:txt
复制
FROM user 
代码语言:txt
复制
 LIMIT %(param_1)s, %(param_2)s
代码语言:txt
复制
2023-08-18 23:10:20,175 INFO sqlalchemy.engine.Engine [generated in 0.00129s] {'param_1': 2, 'param_2': 1}
代码语言:txt
复制
ID: 5
代码语言:txt
复制
Username: string
代码语言:txt
复制
Password: string
代码语言:txt
复制
Nickname: 
代码语言:txt
复制
Phone: 
代码语言:txt
复制
Introduction: string
代码语言:txt
复制
Avatar: string
代码语言:txt
复制
Create Time: 2023-02-25 15:22:33
代码语言:txt
复制
Update Time: 2023-02-25 15:22:33
代码语言:txt
复制
--------------------------------
  • 更新记录

如何根据id更新数据的某个字段,如introduction呢?我们正常的写法是UPDATE user SET introduction=%(introduction)s WHERE user.id = %(user_id)。来看看sqlalchemy是怎么实现的

代码语言:python
复制
print(user)
user.introduction = 'fake user inserted by shigen'
session.commit()
代码语言:txt
复制
ID: 8
代码语言:txt
复制
Username: 杨萍
代码语言:txt
复制
Password: 4(Z7+AlF1p
代码语言:txt
复制
Nickname: jingyao
代码语言:txt
复制
Phone: 15062497241
代码语言:txt
复制
Introduction: 位置资料应用最后.只要我的还有产品.
代码语言:txt
复制
数据得到希望还是看到.行业目前成为.发现评论其中成为.信息这种今天那么.
代码语言:txt
复制
电影说明完全.表示已经论坛选择.
代码语言:txt
复制
应该是一为什基本点击.电子所以语言今年其实发现.
代码语言:txt
复制
人员非常处理全国自己深圳.首页应该进入正在电子学生一个.信息提高表示对于企业如果搜索.
代码语言:txt
复制
企业阅读你的但是表示觉得什么图片.非常一起浏览.状态作为这些主要其中科技.方面正在基本当前.
代码语言:txt
复制
Avatar: https://dummyimage.com/954x642
代码语言:txt
复制
Create Time: 2023-04-30 16:16:14
代码语言:txt
复制
Update Time: 2023-08-02 06:36:35
代码语言:txt
复制
2023-08-18 13:21:55,464 INFO sqlalchemy.engine.Engine UPDATE user SET introduction=%(introduction)s WHERE user.id = %(user_id)s
代码语言:txt
复制
2023-08-18 13:21:55,465 INFO sqlalchemy.engine.Engine [generated in 0.00151s] {'introduction': 'fake user inserted by shigen', 'user_id': 8}
代码语言:txt
复制
2023-08-18 13:21:55,468 INFO sqlalchemy.engine.Engine COMMIT
  • 删除记录

我们看到delete的参数是user对象,意思是我们可以直接先找到要删除的对象,然后调用delete方法删除

代码语言:python
复制
session.delete(user)
session.commit()
代码语言:txt
复制
2023-08-18 13:32:49,361 INFO sqlalchemy.engine.Engine DELETE FROM user WHERE user.id = %(id)s
代码语言:txt
复制
2023-08-18 13:32:49,363 INFO sqlalchemy.engine.Engine [generated in 0.00147s] {'id': 9}
代码语言:txt
复制
2023-08-18 13:32:49,365 INFO sqlalchemy.engine.Engine COMMIT
  • 关闭连接

和之前讲的一样,shigen是资源节省型的猿,不用的连接就关了。

代码语言:python
复制
session.close_all()
代码语言:txt
复制
/var/folders/23/cm3_pjkd00s3s4nq8d9jwk6c0000gn/T/ipykernel_64946/2483070458.py:1: SADeprecationWarning: The Session.close_all() method is deprecated and will be removed in a future release.  Please refer to session.close_all_sessions(). (deprecated since: 1.3)
代码语言:txt
复制
  session.close_all()

附加

你以为我讲这些就完了?任何的入门的博客都会讲。shigen喜欢来点不一样的 ,来看看sqlalchemy更高级的用法吧。

在这里,我先准备100条数据作为测试的数据。

代码语言:python
复制
users = [fake_user() for _ in range(100)]
session.add_all(users)
session.commit()
代码语言:txt
复制
2023-08-18 21:26:58,227 INFO sqlalchemy.engine.Engine BEGIN (implicit)
代码语言:txt
复制
2023-08-18 21:26:58,235 INFO sqlalchemy.engine.Engine INSERT INTO user (username, password, nickname, phone, introduction, avatar, create_time, update_time) VALUES (%(username)s, %(password)s, %(nickname)s, %(phone)s, %(introduction)s, %(avatar)s, %(create_time)s, %(update_time)s)
代码语言:txt
复制
2023-08-18 21:26:58,243 INFO sqlalchemy.
代码语言:txt
复制
 (207, '胡秀兰', '+iHBiytG8)', 'jshi', '13607792007', '有些标题发现其他一些简介.\n不能空间方面决定这里起来情况学生.最新发展经济您的有关.\n阅读管理完全你们看到工作显示.应用事情地区结果.首页男人系统一点没有的人.文化其中时候一种我的决定.\n次数选择这些作为进行出来包括.为什是一类型两个.为了结果查看游戏根据.\n直接人员全国留言喜欢希望.工具因此公司环境直接.\n下载如果男人.都是但是经验项目工程.', 'https://picsum.photos/258/854', datetime.datetime(2021, 12, 14, 21, 15, 9), datetime.datetime(2023, 8, 11, 2, 35, 42), 0),
代码语言:txt
复制
 (208, '程建华', 'Z%uAl1GsoE', 'wei43', '13250061097', '能力市场以后社区合作事情时间设备.生产主题对于希望.\n搜索安全实现发展汽车.知道更新完成直接历史积分.次数销售要求全国.\n出来一些部分.学生完全原因生产帖子.的话这些会员北京无法.\n开发文件完全那么还是原因威望.以下等级具有回复.之后她的有限不会各种来源.\n地方不是软件.\n应用的人公司事情系统同时发现美国.方面继续最大等级那么学生.\n类别音乐当前一般.世界来自没有名称地方拥有自己.', 'https://dummyimage.com/816x740', datetime.datetime(2021, 3, 25, 2, 5, 1), datetime.datetime(2023, 8, 2, 7, 32, 3), 0),
代码语言:txt
复制
 (209, '张淑珍', '+(%jE@*gN3', 'leihe', '13111431970', '实现能够发表方法而且时间.自己次数一些虽然参加所有学习是一.大学查看只有介绍因此会员你们.\n他的发生数据.您的地址文件不是部分搜索这种.一切得到历史我们今天标准.\n知道回复是否还有.结果政府责任这是.业务生活以下不会基本学校.\n大家商品部门汽车解决.方式软件来自浏览美国搜索留言所以.企业你们工程或者只是城市.\n而且语言需要能够其实.经验方式功能如果最后地区情况.', 'https://picsum.photos/578/908', datetime.datetime(2021, 11, 26, 22, 26, 6), datetime.datetime(2023, 8, 18, 14, 21, 34), 0)]
  • 执行sql表达式
代码语言:python
复制
session.query(User).filter(text("id > :id")).params(id=204).all()
代码语言:txt
复制
2023-08-18 22:02:11,210 INFO sqlalchemy.engine.Engine SELECT user.id AS user_id, user.username AS user_username, user.password AS user_password, user.nickname AS user_nickname, user.phone AS user_phone, user.introduction AS user_introduction, user.avatar AS user_avatar, user.create_time AS user_create_time, user.update_time AS user_update_time 
代码语言:txt
复制
FROM user 
代码语言:txt
复制
WHERE id > %(id)s
代码语言:txt
复制
2023-08-18 22:02:11,211 INFO sqlalchemy.engine.Engine [generated in 0.00084s] {'id': 204}
代码语言:txt
复制
[<User(id=205, username=梁桂兰, nickname=chao32)>,
代码语言:txt
复制
 <User(id=206, username=曾俊, nickname=vtao)>,
代码语言:txt
复制
 <User(id=207, username=胡秀兰, nickname=jshi)>,
代码语言:txt
复制
 <User(id=208, username=程建华, nickname=wei43)>,
代码语言:txt
复制
 <User(id=209, username=张淑珍, nickname=leihe)>]

可以看到,效果都是一样的,就看实际的场景哪种更方便了。

事件监听器

事件监听器可以捕捉和处理操作数据库的事件

代码语言:python
复制
from sqlalchemy import event

# 插入一条模拟的数据
session.add(fake_user())
session.commit()

def after_insert_event(mapper, connection, target):
    # 执行操作后的处理逻辑
    print('事件监听:-----------', mapper, connection, target)

event.listens_for(User, 'after_user_insert', after_insert_event)
代码语言:txt
复制
2023-08-18 22:21:53,819 INFO sqlalchemy.engine.Engine BEGIN (implicit)
代码语言:txt
复制
2023-08-18 22:21:53,821 INFO sqlalchemy.engine.Engine INSERT INTO user (username, password, nickname, phone, introduction, avatar, create_time, update_time) VALUES (%(username)s, %(password)s, %(nickname)s, %(phone)s, %(introduction)s, %(avatar)s, %(create_time)s, %(update_time)s)
代码语言:txt
复制
2023-08-18 22:21:53,821 INFO sqlalchemy.engine.Engine [cached since 956s ago] {'username': '刘建', 'password': '^8HnPs0i5f', 'nickname': 'ichen', 'phone': '15794048888', 'introduction': '环境经济北京处理进行信息提高.工程不会人员不断功能自己其实.通过这种公司一点学生资料.\n这么以下更新其他解决提供如此重要.其中回复数据朋友是一由于怎么学校.\n现在地址来源不过产品经营.人员她的东西已经.主题一般联系详细您的全部.\n一些一次留言完成音乐一样.\n只是阅读帖子只有我们非常感觉地方.以及地址对于来自继续部门完全点击.\n世界虽然因此公司.经验其中完全.', 'avatar': 'https://placekitten.com/27/539', 'create_time': datetime.datetime(2021, 11, 30, 9, 57, 17), 'update_time': datetime.datetime(2023, 8, 4, 11, 53, 31)}
代码语言:txt
复制
Mapper[User(user)] <sqlalchemy.engine.base.Connection object at 0x107a0a640> ID: 225
代码语言:txt
复制
Username: 刘建
代码语言:txt
复制
Password: ^8HnPs0i5f
代码语言:txt
复制
Nickname: ichen
代码语言:txt
复制
Phone: 15794048888
代码语言:txt
复制
Introduction: 环境经济北京处理进行信息提高.工程不会人员不断功能自己其实.通过这种公司一点学生资料.
代码语言:txt
复制
这么以下更新其他解决提供如此重要.其中回复数据朋友是一由于怎么学校.
代码语言:txt
复制
现在地址来源不过产品经营.人员她的东西已经.主题一般联系详细您的全部.
代码语言:txt
复制
一些一次留言完成音乐一样.
代码语言:txt
复制
只是阅读帖子只有我们非常感觉地方.以及地址对于来自继续部门完全点击.
代码语言:txt
复制
世界虽然因此公司.经验其中完全.
代码语言:txt
复制
Avatar: https://placekitten.com/27/539
代码语言:txt
复制
Create Time: 2021-11-30 09:57:17
代码语言:txt
复制
Update Time: 2023-08-04 11:53:31
代码语言:txt
复制
事件监听 Mapper[User(user)] <sqlalchemy.engine.base.Connection object at 0x107a0a640> ID: 225
代码语言:txt
复制
Username: 刘建
代码语言:txt
复制
Password: ^8HnPs0i5f
代码语言:txt
复制
Nickname: ichen
代码语言:txt
复制
Phone: 15794048888
代码语言:txt
复制
Introduction: 环境经济北京处理进行信息提高.工程不会人员不断功能自己其实.通过这种公司一点学生资料.
代码语言:txt
复制
这么以下更新其他解决提供如此重要.其中回复数据朋友是一由于怎么学校.
代码语言:txt
复制
现在地址来源不过产品经营.人员她的东西已经.主题一般联系详细您的全部.
代码语言:txt
复制
一些一次留言完成音乐一样.
代码语言:txt
复制
只是阅读帖子只有我们非常感觉地方.以及地址对于来自继续部门完全点击.
代码语言:txt
复制
世界虽然因此公司.经验其中完全.
代码语言:txt
复制
Avatar: https://placekitten.com/27/539
代码语言:txt
复制
Create Time: 2021-11-30 09:57:17
代码语言:txt
复制
Update Time: 2023-08-04 11:53:31
代码语言:txt
复制
事件监听:----------- Mapper[User(user)] <sqlalchemy.engine.base.Connection object at 0x107a0a640> ID: 225
代码语言:txt
复制
Username: 刘建
代码语言:txt
复制
Password: ^8HnPs0i5f
代码语言:txt
复制
Nickname: ichen
代码语言:txt
复制
Phone: 15794048888
代码语言:txt
复制
Introduction: 环境经济北京处理进行信息提高.工程不会人员不断功能自己其实.通过这种公司一点学生资料.
代码语言:txt
复制
这么以下更新其他解决提供如此重要.其中回复数据朋友是一由于怎么学校.
代码语言:txt
复制
现在地址来源不过产品经营.人员她的东西已经.主题一般联系详细您的全部.
代码语言:txt
复制
一些一次留言完成音乐一样.
代码语言:txt
复制
只是阅读帖子只有我们非常感觉地方.以及地址对于来自继续部门完全点击.
代码语言:txt
复制
世界虽然因此公司.经验其中完全.
代码语言:txt
复制
Avatar: https://placekitten.com/27/539
代码语言:txt
复制
Create Time: 2021-11-30 09:57:17
代码语言:txt
复制
Update Time: 2023-08-04 11:53:31
代码语言:txt
复制
2023-08-18 22:21:53,823 INFO sqlalchemy.engine.Engine COMMIT
代码语言:txt
复制
<function sqlalchemy.event.api.listens_for.<locals>.decorate(fn: 'Callable[..., Any]') -> 'Callable[..., Any]'>

事务的管理

这也是Java中常用的事务管理

代码语言:python
复制
try:
    session.begin()
    user = session.query(User).filter_by(id=222).first()
    session.delete(user)
    zero = 2/0
except Exception as e:
    session.rollback()
    print("Error occurred, rolling")
finally:
    session.close()
代码语言:txt
复制
2023-08-18 22:29:38,840 INFO sqlalchemy.engine.Engine BEGIN (implicit)
代码语言:txt
复制
2023-08-18 22:29:38,842 INFO sqlalchemy.engine.Engine SELECT user.id AS user_id, user.username AS user_username, user.password AS user_password, user.nickname AS user_nickname, user.phone AS user_phone, user.introduction AS user_introduction, user.avatar AS user_avatar, user.create_time AS user_create_time, user.update_time AS user_update_time 
代码语言:txt
复制
FROM user 
代码语言:txt
复制
WHERE user.id = %(id_1)s 
代码语言:txt
复制
 LIMIT %(param_1)s
代码语言:txt
复制
2023-08-18 22:29:38,843 INFO sqlalchemy.engine.Engine [cached since 203.5s ago] {'id_1': 222, 'param_1': 1}
代码语言:txt
复制
2023-08-18 22:29:38,846 INFO sqlalchemy.engine.Engine ROLLBACK
代码语言:txt
复制
Error occurred, rolling

这是常见的事务中间出现异常了,事务回滚。可以作为操作数据库的一个模板来使用

好了,以上就是sqlalchemy使用的全部分享了,希望对你有所帮助。也期待您的点赞、评论、在看和关注哈。您的支持将是shigen不断更新创作的动力。

shigen一起,每天不一样!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 使用
  • 附加
    • 事件监听器
      • 事务的管理
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档