python ORM框架 sqlAlchemy

news2025/1/15 17:03:11

背景

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

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

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

pip install sqlalchemy pymysql

使用

  • 导入需要的模块和函数

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

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这个会话对象,进而去操作数据库。

#### 配置数据库信息
username="root"
password="123456"
host="localhost"
database_name="security"
engine = create_engine(f'mysql+pymysql://{username}:{password}@{host}/{database_name}', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
  • 创建对象基类
Base = declarative_base()
/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)
  Base = declarative_base()

查看对应的数据库结构

desc user;

  • 定义User类并继承Base
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实现数据的模拟

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

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

user = fake_user()
user
<User(id=None, username=李旭, nickname=junshen)>
  • 创建数据库表,若存在表不会创建

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

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

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

  • 查询单条

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

session.query(User).filter_by(nickname='junshen').first()
2023-08-18 13:32:07,443 INFO sqlalchemy.engine.Engine BEGIN (implicit)
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 
FROM user 
WHERE user.nickname = %(nickname_1)s 
 LIMIT %(param_1)s
2023-08-18 13:32:07,446 INFO sqlalchemy.engine.Engine [cached since 291.8s ago] {'nickname_1': 'junshen', 'param_1': 1}





<User(id=9, username=李旭, nickname=junshen)>
  • 查询所有的记录

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

users = session.query(User).offset(2).limit(1).all()
for user in users:
    print(user)
    print('--------------------------------')
2023-08-18 23:10:20,170 INFO sqlalchemy.engine.Engine BEGIN (implicit)
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 
FROM user 
 LIMIT %(param_1)s, %(param_2)s
2023-08-18 23:10:20,175 INFO sqlalchemy.engine.Engine [generated in 0.00129s] {'param_1': 2, 'param_2': 1}
ID: 5
Username: string
Password: string
Nickname: 
Phone: 
Introduction: string
Avatar: string
Create Time: 2023-02-25 15:22:33
Update Time: 2023-02-25 15:22:33
--------------------------------
  • 更新记录

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

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

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

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

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

session.close_all()
/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)
  session.close_all()

附加

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

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

users = [fake_user() for _ in range(100)]
session.add_all(users)
session.commit()
2023-08-18 21:26:58,227 INFO sqlalchemy.engine.Engine BEGIN (implicit)
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)

2023-08-18 21:26:58,865 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)
2023-08-18 21:26:58,866 INFO sqlalchemy.engine.Engine [cached since 5257s ago] {'username': '李凤兰', 'password': 'CPCC@8Xg)A', 'nickname': 'wuyong', 'phone': '18803078339', 'introduction': '登录管理处理我的.大小地址一般因此是否.\n的人任何活动标题.说明项目合作.\n作品没有感觉得到网上工具专业.然后一次用户下载支持查看.到了客户质量日期.\n为什来自上海信息公司非常这个.\n网络就是日本学生软件电影.作品我的经验知道技术影响说明的话.\n关系专业语言网络国家更新.国家首页的是一下表示.\n同时今年社会设备.公司自己最后女人准备政府.来自新闻东西市场科技东西介绍.', 'avatar': 'https://dummyimage.com/65x327', 'create_time': datetime.datetime(2020, 10, 4, 6, 8, 38), 'update_time': datetime.datetime(2023, 8, 2, 4, 23, 38)}

通过上边的日志,我们明显的看到100条假数据成功的插入到数据库了。现在,我们有了足够的数据进行操作了。

聚合函数和统计

  • 使用聚合函数进行统计
from sqlalchemy import func
# 统计用户数
cnt = session.query(func.count(User.id)).scalar()
# 统计ID的平均值
avg = session.query(func.avg(User.id)).scalar()
print(cnt, avg)
2023-08-18 21:49:09,211 INFO sqlalchemy.engine.Engine SELECT count(user.id) AS count_1 
FROM user
2023-08-18 21:49:09,212 INFO sqlalchemy.engine.Engine [cached since 119s ago] {}
2023-08-18 21:49:09,215 INFO sqlalchemy.engine.Engine SELECT avg(user.id) AS avg_1 
FROM user
2023-08-18 21:49:09,216 INFO sqlalchemy.engine.Engine [cached since 39.08s ago] {}
205 106.9415
  • 分组统计

这里选取电话号码的前三位统计,按照数量倒序,取前五

session.query(func.substr(User.phone, 1, 3), func.count(User.id)) \
                .group_by(func.substr(User.phone, 1, 3)) \
                .order_by(func.count(User.id).desc()) \
                .limit(5) \
                .all()
2023-08-18 21:52:52,398 INFO sqlalchemy.engine.Engine SELECT substr(user.phone, %(substr_2)s, %(substr_3)s) AS substr_1, count(user.id) AS count_1 
FROM user GROUP BY substr(user.phone, %(substr_4)s, %(substr_5)s) ORDER BY count(user.id) DESC 
 LIMIT %(param_1)s
2023-08-18 21:52:52,398 INFO sqlalchemy.engine.Engine [generated in 0.00079s] {'substr_2': 1, 'substr_3': 3, 'substr_4': 1, 'substr_5': 3, 'param_1': 5}





[('135', 12), ('145', 11), ('132', 10), ('188', 10), ('180', 9)]

查询构造器filter()

session.query(User).filter(User.id > 18, User.nickname == 'chao30').all()
2023-08-18 21:55:34,218 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 
FROM user 
WHERE user.id > %(id_1)s AND user.nickname = %(nickname_1)s
2023-08-18 21:55:34,219 INFO sqlalchemy.engine.Engine [generated in 0.00086s] {'id_1': 18, 'nickname_1': 'chao30'}





[<User(id=136, username=廖波, nickname=chao30)>]

原生sql和sql表达式

from sqlalchemy import text

# 执行原生的sql
session.execute(text("select * from user where id > 204")).fetchall()
2023-08-18 22:01:03,006 INFO sqlalchemy.engine.Engine select * from user where id > 204
2023-08-18 22:01:03,007 INFO sqlalchemy.engine.Engine [cached since 14.12s ago] {}





[(205, '梁桂兰', '(oUYy%895Q', 'chao32', '14525490504', '科技不同你们结果得到成功经济.为什重要的话感觉地址社区.\n简介销售具有成功软件公司进行.包括就是必须网络发布一起处理.世界一些能力可能手机其中.\n最新学校历史需要类型资源之后.阅读孩子选择要求人民如果阅读.\n作为虽然安全特别.其中地址一次可以女人应该不过.\n以下不是企业谢谢发生北京.方面为什合作根据需要市场.\n但是有限建设报告记者北京.一点威望是一时间.', 'https://picsum.photos/984/142', datetime.datetime(2022, 7, 5, 16, 38, 6), datetime.datetime(2023, 8, 2, 20, 33, 55), 0)
  • 执行sql表达式
session.query(User).filter(text("id > :id")).params(id=204).all()
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 
FROM user 
WHERE id > %(id)s
2023-08-18 22:02:11,211 INFO sqlalchemy.engine.Engine [generated in 0.00084s] {'id': 204}





[<User(id=205, username=梁桂兰, nickname=chao32)>]

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

事件监听器

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

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





<function sqlalchemy.event.api.listens_for.<locals>.decorate(fn: 'Callable[..., Any]') -> 'Callable[..., Any]'>

事务的管理

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

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()

2023-08-18 22:29:38,840 INFO sqlalchemy.engine.Engine BEGIN (implicit)
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 
FROM user 
WHERE user.id = %(id_1)s 
 LIMIT %(param_1)s
2023-08-18 22:29:38,843 INFO sqlalchemy.engine.Engine [cached since 203.5s ago] {'id_1': 222, 'param_1': 1}
2023-08-18 22:29:38,846 INFO sqlalchemy.engine.Engine ROLLBACK
Error occurred, rolling

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

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

shigen一起,每天不一样!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/896784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神经网络简单理解:机场登机

目录 神经网络简单理解&#xff1a;机场登机 ​编辑 激活函数&#xff1a;转为非线性问题 ​编辑 激活函数ReLU 通过神经元升维&#xff08;神经元数量&#xff09;&#xff1a;提升线性转化能力 通过增加隐藏层&#xff1a;增加非线性转化能力​编辑 模型越大&#xff0c;…

OpenCV 玩转图像和视频

为什么学OpenCV&#xff1f; • OpenCV ⽀持对图像缩放、旋转、绘制⽂字图形等基础操作 • OpenCV 库包含了很多计算机视觉领域常⻅算法&#xff1a;⽬标检测、⽬标跟踪等 OpenCV 简介 • OpenCV (Open Source Computer Vision) 是计算机视觉和机器学习软件库 • Intel 1999…

特殊数字专题

特殊数字 1.奇数2.偶数3.完数4.素数5.回文数6.水仙花数7.中位数9.随机数11.求年份&#xff1a;闰年12.求数字&#xff1a;两个整数的最大公约数及最小公倍数 1.奇数 代码案例&#xff1a; //输出所有1-1000之间的奇数 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h&…

Java虚拟机(JVM):虚拟机栈溢出

一、概念 Java虚拟机栈溢出&#xff08;Java Virtual Machine Stack Overflow&#xff09;是指在Java程序中&#xff0c;当线程调用的方法层级过深&#xff0c;导致栈空间溢出的情况。 Java虚拟机栈是每个线程私有的&#xff0c;用于存储方法的调用和局部变量的内存空间。每当…

Java二分法查找

二分法&#xff1a;首先需要一个由小到大排序好的数组&#xff0c;先找到其中间值&#xff0c;然后进行比较如果比较中间值大的话则向前找。如果比要找的小&#xff0c;则向后找。 代码实现&#xff1a; //定义查询方法 public static int searchTarget(int[] nums, int targ…

用户新增预测(Datawhale机器学习AI夏令营第三期)

文章目录 简介任务1&#xff1a;跑通Baseline实操并回答下面问题&#xff1a;如果将submit.csv提交到讯飞比赛页面&#xff0c;会有多少的分数&#xff1f;代码中如何对udmp进行了人工的onehot&#xff1f; 任务2.1&#xff1a;数据分析与可视化编写代码回答下面的问题&#xf…

【CSS动画02--卡片旋转3D】

CSS动画02--卡片旋转3D 介绍代码HTMLCSS css动画02--旋转卡片3D 介绍 当鼠标移动到中间的卡片上会有随着中间的Y轴进行360的旋转&#xff0c;以下是几张图片的介绍&#xff0c;上面是鄙人自己录得一个供大家参考的小视频&#x1f92d; 代码 HTML <!DOCTYPE html>…

上半年营收19亿,金融壹账通第二增长曲线“加速上坡”

8月16日&#xff0c;壹账通金融科技有限公司&#xff08;下称“金融壹账通”&#xff09;发布了截至2023年6月30日中期业绩报告。 根据财报&#xff0c;2023年上半年&#xff0c;金融壹账通实现营收18.99亿元&#xff0c;毛利润为6.96亿元&#xff1b;归母净利润率从-26.1%提升…

(ElementPlus)操作(不使用 ts): Form表单检验、规则及案例分析(这一篇就够了)

Ⅰ、Form 表单检验简介&#xff1a; 1、什么是 Form 表单检验&#xff1f; 其一、属性&#xff1a; 表单验证是 javascript 中的高级选项之一&#xff1b; 其二、定义&#xff1a; JavaScript 在数据被送往服务器前对 HTML 中的 Form 表单中的这些输入数据进行验证的行为就…

MySQL索引介绍 为什么mysql使用B+树

什么是索引&#xff1f; 索引是一种用于快速查询和检索数据的数据结构&#xff0c;常见的索引结构有&#xff1a;B树&#xff0c;B树和Hash。 索引的作用就相当于目录。打个比方&#xff0c;我们在查字典的时候&#xff0c;如果没有目录&#xff0c;那我们就只能一页一页的去…

文本三剑客之sed编辑器

sed 一、sed简介1.1 什么是sed&#xff1f;1.2 sed原理1.3 sed核心功能 二、sed命令格式详解2.1 命令格式2.2 常用选项2.3 sed脚本语法2.3.1 基本语法结构2.3.2 地址部分-----指定匹配范围2.3.3 命令部分-----要执行的命令 三、sed查找替换3.1 基本语法3.2 分组后向引用3.3 变量…

.NET应用UI组件DevExpress XAF v23.1 - 全新的日程模块

DevExpress XAF是一款强大的现代应用程序框架&#xff0c;允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计&#xff0c;开发人员可以选择内建模块&#xff0c;也可以自行创建&#xff0c;从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 在新版中…

【爬虫练习之glidedsky】爬虫-基础2

题目 链接 爬虫往往不能在一个页面里面获取全部想要的数据&#xff0c;需要访问大量的网页才能够完成任务。 这里有一个网站&#xff0c;还是求所有数字的和&#xff0c;只是这次分了1000页。 思路 找到调用接口 可以看到后面有个参数page来控制页码 代码实现 import reques…

Python功能制作之简单的3D特效

需要导入的库&#xff1a; pygame: 这是一个游戏开发库&#xff0c;用于创建多媒体应用程序&#xff0c;提供了处理图形、声音和输入的功能。 from pygame.locals import *: 导入pygame库中的常量和函数&#xff0c;用于处理事件和输入。 OpenGL.GL: 这是OpenGL的Python绑定…

win10下IDEA搭建web项目脚手架

参考 IDEA运行Maven项目配置全过程(菜鸟专属)_idea配置maven_Hi梅的博客-CSDN博客 下载 IDEA 下载JDK 1.8 https://pan.baidu.com/s/1lj2na9omGwhPrCKYNz1qSQ 提取码:izkj 点击exe一步步next 添加环境变量: JAVA_HOME 对于自己jdk的路径 添加系统变量PATH:%JAVA_H…

混杂接口模式---vlan

策略在两个地方可以用--1、重发布 2、bgp邻居 2、二层可以干的&#xff0c;三层也可以干 3、未知单播&#xff1a;交换机的MAC地址表的记录保留时间是5分钟&#xff0c;电脑的ARP表的记录保留时间是2小时 4、route recursive-lookup tunnel 华为默认对于bgp学习来的路由不开启标…

在Hive/Spark上执行TPC-DS基准测试 (PARQUET格式)

在上一篇文章:《在Hive/Spark上运行执行TPC-DS基准测试 (ORC和TEXT格式)》中,我们介绍了如何使用 hive-testbench 在Hive/Spark上执行TPC-DS基准测试,同时也指出了该项目不支持parquet格式。 如果我们想要生成parquet格式的测试数据,就需要使用其他工具了。本文选择使用另…

深入了解Maven(一)

目录 一.Maven介绍与功能 二.依赖管理 1.依赖的配置 2.依赖的传递性 3.排除依赖 4.依赖的作用范围 5.依赖的生命周期 一.Maven介绍与功能 maven是一个项目管理和构建工具&#xff0c;是基于对象模型POM实现。 Maven的作用&#xff1a; 便捷的依赖管理&#xff1a;使用…

[.NET/WPF] CommunityToolkit.Mvvm 异步指令

我们在开发中, 经常会有这样的需求: 点击按钮后, 进行一些耗时的工作工作进行时, 按钮不可再次被点击工作进行时, 会显示进度条, 或者 “加载中” 的动画 RelayCommand CommunityToolkit.Mvvm 中的 RelayCommand 除了支持最简单的同步方法, 还支持以 Task 作为返回值的异步方…

开源语音聊天软件Mumble

网友 大气 告诉我&#xff0c;Openblocks在国内还有个版本叫 码匠&#xff0c;更贴合国内软件开发的需求&#xff0c;如接入了国内常用的身份认证&#xff0c;接入了国内的数据库和云服务&#xff0c;也对小程序、企微 sdk 等场景做了适配。 在 https://majiang.co/docs/docke…