【Flask 系统教程 7】数据库使用 SQLAlchemy

SQLAlchemy 是一个功能强大的 SQL 工具包和对象关系映射 (ORM) 库。使用 Flask 和 SQLAlchemy 可以方便地连接和操作数据库。

SQLAlchemy基本操作

连接数据库

环境准备

首先,确保你已经安装了SQLAlchemy 。可以使用以下命令安装这些库:

pip install sqlalchemy 
from sqlalchemy import create_engine, text# 设置数据库配置
HOST = 'localhost'
PORT = 3306
DATABASE = 'flask_db'  # 需要在MySQL中事先创建好flask_db数据库
USER = 'root'
PASSWORD = 'password'SQLALCHEMY_DATABASE_URI = f'mysql+pymysql://{USER}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'engine = create_engine(url=SQLALCHEMY_DATABASE_URI)
conn = engine.connect()  # 创建连接对象sql = text('SELECT 1;')  # 模拟查询
result = conn.execute(sql)
print(result.fetchone())conn.close()  # 关闭连接

在以上案例中,实现了使用SQLAlchemy连接本地MySQL数据库并执行原生SQL语句。

通过类映射表结构

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base# 设置数据库配置
HOST = 'localhost'
PORT = 3306
DATABASE = 'flask_db'  # 需要在MySQL中事先创建好flask_db数据库
USER = 'root'
PASSWORD = 'password'# 构建数据库连接URI
SQLALCHEMY_DATABASE_URI = f'mysql+pymysql://{USER}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'# 创建数据库引擎
engine = create_engine(SQLALCHEMY_DATABASE_URI)# 创建基类
Base = declarative_base()# 定义模型类
class User(Base):__tablename__ = 'users'  # 设置表名id = Column(Integer, primary_key=True)name = Column(String(50))  # 设置name字段 指定长度为50age = Column(Integer)# 使用模型类来创建表
Base.metadata.create_all(engine)

这段代码使用 SQLAlchemy 通过模型类创建了一个名为 “users” 的表,该表包含 id、name 和 age 列,并将其映射到了 MySQL 数据库中。

需要注意的是如果已经创建过来过了,则无法再次通过Base.metadata.create_all(engine)创建同名表

映射表常用数据类型

字段类型描述
Integer整数类型
String(length)字符串类型,必须指定长度
Text可变长度的文本类型,通常用于大文本字段
Float浮点数类型
Boolean布尔值类型
Date日期类型(年-月-日)
Time时间类型(时-分-秒)
DateTime日期和时间类型
LargeBinary二进制数据类型,通常用于存储文件或图片
Enum枚举类型,用于存储一组有限的字符串或整数值
Numeric精确数字类型,通常用于货币和需要高精度的数值
Interval时间间隔类型
JSONJSON 类型,用于存储 JSON 数据
PickleType使用 Python pickle 序列化的任意 Python 对象

示例:

from sqlalchemy import create_engine, Column, Integer, String, Text, Float, Boolean, Date, Time, DateTime, LargeBinary, Enum, Numeric, Interval, JSON
from sqlalchemy.orm import declarative_base, sessionmaker
import enum
from datetime import datetime, date, time, timedelta# 设置数据库配置
HOST = 'localhost'
PORT = 3306
DATABASE = 'flask_db'  # 需要在MySQL中事先创建好flask_db数据库
USER = 'root'
PASSWORD = 'password'# 构建数据库连接URI
SQLALCHEMY_DATABASE_URI = f'mysql+pymysql://{USER}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'# 创建数据库引擎
engine = create_engine(SQLALCHEMY_DATABASE_URI)# 创建基类
Base = declarative_base()# 定义枚举类型
class Status(enum.Enum):ACTIVE = 'active'INACTIVE = 'inactive'# 定义模型类
class Example(Base):__tablename__ = 'example'id = Column(Integer, primary_key=True)name = Column(String(50))description = Column(Text)price = Column(Float)is_active = Column(Boolean)created_date = Column(Date)created_time = Column(Time)created_datetime = Column(DateTime)data = Column(LargeBinary)status = Column(Enum(Status))precision_number = Column(Numeric(10, 2))duration = Column(Interval)json_data = Column(JSON)# 使用模型类来创建表
Base.metadata.create_all(engine)# 创建会话工厂
Session = sessionmaker(bind=engine)
session = Session()# 插入示例数据
example = Example(name='Example Name',description='This is a text description.',price=19.99,is_active=True,created_date=date.today(),created_time=datetime.now().time(),created_datetime=datetime.now(),data=b'binary data',status=Status.ACTIVE,precision_number=1234.56,duration=timedelta(days=1, hours=2),json_data={'key': 'value'}
)with Session() as session:session.add(example)session.commit()# 查询示例数据
with Session() as session:example = session.query(Example).first()print(example.name, example.description, example.price, example.is_active)

这个示例代码展示了如何在 SQLAlchemy 模型类中使用各种常见的字段类型,并插入和查询数据。

column常用参数

好的,以下是 SQLAlchemy 中 Column 的常见参数及其描述的表格形式:

参数名描述
name列的名称,如果未提供则使用作为关键字参数传递的属性名
type列的数据类型,例如 IntegerStringBoolean
primary_key是否为主键,默认值为 False
nullable是否允许 NULL 值,默认值为 True
default列的默认值,可以是一个值或一个函数
unique是否在该列上创建唯一索引,默认值为 False
index是否在该列上创建常规索引,默认值为 False
server_default在服务器端设置的默认值,例如 func.now() 用于时间戳
server_onupdate在服务器端更新时的默认值,例如 func.now() 用于时间戳更新
autoincrement是否自动递增,只对 Integer 类型有效,默认值为 auto(如果是主键则自动递增)
comment列的注释,可以是任意字符串
onupdate在行更新时自动应用的值或函数
foreign_key外键约束,引用另一个表的列
primaryjoin使用复杂的条件来定义外键关系
doc列的文档字符串,可以用于生成自动文档
info任意元数据字典,可以用于存储额外的信息

下面是一个示例,展示如何在 SQLAlchemy 模型类中使用这些参数:

from sqlalchemy import create_engine, Column, Integer, String, Boolean, DateTime, func
from sqlalchemy.orm import declarative_base, sessionmaker
# 设置数据库配置
HOST = 'localhost'
PORT = 3306
DATABASE = 'flask_db'  # 需要在MySQL中事先创建好flask_db数据库
USER = 'root'
PASSWORD = 'password'# 构建数据库连接URI
SQLALCHEMY_DATABASE_URI = f'mysql+pymysql://{USER}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'# 创建数据库引擎
engine = create_engine(SQLALCHEMY_DATABASE_URI)# 创建基类
Base = declarative_base()# 定义模型类
class User(Base):__tablename__ = 'worker'# 主键 自增 注释id = Column(Integer, primary_key=True, autoincrement=True, comment="User ID")# 不可为空 不可重复 设为索引 注释username = Column(String(50), nullable=False, unique=True, index=True, comment="Username")# 不可为空 不可重复 注释email = Column(String(100), nullable=False, unique=True, comment="Email Address")# 默认为true 注释is_active = Column(Boolean, default=True, comment="Is Active")# 默认为现在时间 注释created_at = Column(DateTime, default=func.now(), comment="Created At")# 默认为现在时间 更新时间设置为当前时间 注释updated_at = Column(DateTime, default=func.now(), onupdate=func.now(), comment="Updated At")# 使用模型类来创建表
Base.metadata.create_all(engine)# 创建会话工厂
Session = sessionmaker(bind=engine)
session = Session()# 插入示例数据
new_user = User(username='johndoe', email='johndoe@example.com')with Session() as session:session.add(new_user)session.commit()# 查询示例数据
with Session() as session:user = session.query(User).filter_by(username='johndoe').first()print(user.username, user.email, user.is_active, user.created_at, user.updated_at)

这个示例展示了如何使用 Column 的各种参数来定义 SQLAlchemy 模型中的字段,包括设置默认值、唯一约束、索引、注释等。

增删改查CURD

综合常用

创建一个 SQLAlchemy 的 session 对象,并使用它执行增、删、改、查操作:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker# 设置数据库配置
HOST = 'localhost'
PORT = 3306
DATABASE = 'flask_db'  # 需要在MySQL中事先创建好flask_db数据库
USER = 'root'
PASSWORD = 'password'# 构建数据库连接URI
SQLALCHEMY_DATABASE_URI = f'mysql+pymysql://{USER}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'# 创建数据库引擎
engine = create_engine(SQLALCHEMY_DATABASE_URI)# 创建基类
Base = declarative_base()# 定义模型类
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String(50))age = Column(Integer)# 使用模型类来创建表
Base.metadata.create_all(engine)# 创建会话工厂
Session = sessionmaker(bind=engine)def add_user(name, age):with Session() as session:new_user = User(name=name, age=age)session.add(new_user)session.commit()def get_user_by_name(name):with Session() as session:user = session.query(User).filter_by(name=name).first()# user = session.query(User).filter(User.name == name).first() 这种用法等价return userdef add_user_many(name_age_list):with Session() as session:users = [User(name=name, age=age) for name, age in name_age_list]session.add_all(users)session.commit()def get_all_users():with Session() as session:users = session.query(User).all()return usersdef update_user(name, new_age):with Session() as session:user_to_update = session.query(User).filter_by(name=name).first()if user_to_update:user_to_update.age = new_agesession.commit()def delete_user(name):with Session() as session:user_to_delete = session.query(User).filter_by(name=name).first()# 实际上是先查找再删除对象if user_to_delete:session.delete(user_to_delete)session.commit()# 测试函数
if __name__ == '__main__':# 增加单个用户add_user('Alice', 30)# 增加多个用户add_user_many([('Bob', 25), ('Charlie', 35)])# 查询所有用户并打印结果print("======查询所有用户并打印结果======")users = get_all_users()for user in users:print(user.id, user.name, user.age)# 通过姓名查询用户print("======通过姓名查询用户======")user = get_user_by_name('Alice')if user:print(f"Found user: id:{user.id}, name:{user.name}, age:{user.age}")# 修改用户信息update_user('Alice', 31)# 查询更新后的用户并打印结果print("======查询更新后的用户并打印结果======")users = get_all_users()for user in users:print(user.id, user.name, user.age)# 删除用户delete_user('Alice')# 查询所有用户以确认删除操作print("======查询所有用户以确认删除操作======")users = get_all_users()if not any(user.name == 'Alice' for user in users):print("User 'Alice' has been deleted.")

以上代码提供了一些增删改查函数作为案例,通过这些案例的学习相信大家能够了解session的使用方法,并在此基础上改进应用。

query进阶用法

from sqlalchemy import create_engine, Column, Integer, String, Boolean, DateTime, func, ForeignKey, Text
from sqlalchemy.orm import declarative_base, sessionmaker# 设置数据库配置
HOST = 'localhost'
PORT = 3306
DATABASE = 'flask_db'  # 需要在MySQL中事先创建好flask_db数据库
USER = 'root'
PASSWORD = 'password'# 构建数据库连接URI
SQLALCHEMY_DATABASE_URI = f'mysql+pymysql://{USER}:{PASSWORD}@{HOST}:{PORT}/{DATABASE}'# 创建数据库引擎
engine = create_engine(SQLALCHEMY_DATABASE_URI)# 创建基类
Base = declarative_base()# 定义模型类
class Teacher(Base):__tablename__ = 'teachers'id = Column(Integer, primary_key=True, autoincrement=True)username = Column(String(50), nullable=False, unique=True, index=True)email = Column(String(100), nullable=False, unique=True)is_active = Column(Boolean, default=True)created_at = Column(DateTime, default=func.now())updated_at = Column(DateTime, default=func.now(), onupdate=func.now())# 使用模型类来创建表
Base.metadata.create_all(engine)# 创建会话工厂
Session = sessionmaker(bind=engine)
session = Session()# 插入示例数据
def add_sample_data():teacher1 = Teacher(username='johndoe', email='johndoe@example.com')teacher2 = Teacher(username='janedoe', email='janedoe@example.com', is_active=False)teacher3 = Teacher(username='alice', email='alice@example.com')with Session() as session:session.add_all([teacher1, teacher2, teacher3])session.commit()add_sample_data()# 基本查询:查询所有教师
with Session() as session:teachers = session.query(Teacher).all()for teacher in teachers:print(teacher.username, teacher.email)# 过滤查询:查询活跃教师
with Session() as session:active_teachers = session.query(Teacher).filter(Teacher.is_active == True).all()for teacher in active_teachers:print(teacher.username, teacher.email, teacher.is_active)# 排序查询:按创建时间排序
with Session() as session:sorted_teachers = session.query(Teacher).order_by(Teacher.created_at).all()for teacher in sorted_teachers:print(teacher.username, teacher.created_at)# 升序排序
from sqlalchemy import ascwith Session() as session:sorted_teachers_asc = session.query(Teacher).order_by(Teacher.created_at.asc()).all()for teacher in sorted_teachers_asc:print(teacher.username, teacher.created_at)from sqlalchemy import descwith Session() as session:sorted_teachers_desc = session.query(Teacher).order_by(Teacher.created_at.desc()).all()for teacher in sorted_teachers_desc:print(teacher.username, teacher.created_at)# 限制查询:限制返回的记录数
with Session() as session:limited_teachers = session.query(Teacher).limit(2).all()for teacher in limited_teachers:print(teacher.username, teacher.email)# 聚合查询:统计教师总数
with Session() as session:teacher_count = session.query(func.count(Teacher.id)).scalar()print(f'Total teachers: {teacher_count}')# 连接查询:假设有另一个模型 Course,查询教师及其课程数量
class Course(Base):__tablename__ = 'courses'id = Column(Integer, primary_key=True, autoincrement=True)title = Column(String(100))content = Column(Text)teacher_id = Column(Integer, ForeignKey('teachers.id'))Base.metadata.create_all(engine)def add_courses():with Session() as session:teacher = session.query(Teacher).filter_by(username='johndoe').first()course1 = Course(title='Math 101', content='This is the first course', teacher_id=teacher.id)course2 = Course(title='Physics 101', content='This is the second course', teacher_id=teacher.id)session.add_all([course1, course2])session.commit()add_courses()with Session() as session:teacher_courses = session.query(Teacher.username, func.count(Course.id).label('course_count')).join(Course, Teacher.id == Course.teacher_id).group_by(Teacher.username).all()for username, course_count in teacher_courses:print(username, course_count)# 返回指定字段:仅返回用户名和邮箱
with Session() as session:teacher_details = session.query(Teacher.username, Teacher.email).all()for username, email in teacher_details:print(username, email)# 子查询:查询有课程的教师
with Session() as session:subquery = session.query(Course.teacher_id).distinct().subquery()teachers_with_courses = session.query(Teacher).filter(Teacher.id.in_(subquery)).all()for teacher in teachers_with_courses:print(teacher.username, teacher.email)

主要方法说明

  • query(Model):查询指定模型的所有记录。
  • filter(condition):根据给定条件过滤结果。
  • filter_by(**kwargs):根据关键字参数过滤结果。
  • order_by(*columns):对结果进行排序。
  • limit(n):限制返回的结果数量。
  • offset(n):跳过指定数量的结果。
  • count():统计记录数量。
  • sum(column)求和、avg(column)平均值、min(column)最小值、max(column)最大值:对字段进行聚合计算。
  • join(target, onclause):执行 SQL JOIN 操作。
  • with_entities(*entities):仅返回指定的字段。
  • subquery():构建子查询。

filter函数用法

filter函数是SQLAlchemy查询中常用的方法之一,用于构建 子句来筛选查询结果。以下是filter函数的一些常见用法:

1. 等于(Equal)

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)# 创建数据库连接和会话
engine = create_engine('sqlite:///example.db')
Session = sessionmaker(bind=engine)
session = Session()# 查询name等于'John'的记录
result = session.query(User).filter(User.name == 'John').all()

2. 不等于(Not Equal)

# 查询name不等于'John'的记录
result = session.query(User).filter(User.name != 'John').all()

3. 模糊匹配(Like)

# 查询name以'Jo'开头的记录
result = session.query(User).filter(User.name.like('Jo%')).all()

4. 模糊匹配(不区分大小写)(Ilike)

# 查询name以'jo'开头(不区分大小写)的记录
result = session.query(User).filter(User.name.ilike('jo%')).all()

5. 包含(In)

# 查询name在给定列表中的记录
names = ['John', 'Jane', 'Doe']
result = session.query(User).filter(User.name.in_(names)).all()

6. 不包含(Not In)

# 查询name不在给定列表中的记录
names = ['John', 'Jane', 'Doe']
result = session.query(User).filter(~User.name.in_(names)).all()

7. IS NULL

# 查询name为NULL的记录
result = session.query(User).filter(User.name == None).all()

8. IS NOT NULL

# 查询name不为NULL的记录
result = session.query(User).filter(User.name != None).all()

9. AND查询

from sqlalchemy import and_# 查询name为'John'且id大于5的记录
result = session.query(User).filter(and_(User.name == 'John', User.id > 5)).all()

10. OR查询

from sqlalchemy import or_# 查询name为'John'或id大于5的记录
result = session.query(User).filter(or_(User.name == 'John', User.id > 5)).all()

这些是SQLAlchemy中使用filter函数的一些常见方法。通过组合使用这些条件,您可以构建出复杂的查询来满足各种需求。

表关系

外键的使用

在SQLAlchemy中,外键(Foreign Key)用于建立表之间的关系。定义外键时,可以指定不同的删除策略(如RESTRICT、NO ACTION、CASCADE、SET NULL),以控制当父表中的数据被删除时,子表中的数据应该如何处理。

基本用法

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()class Parent(Base):__tablename__ = 'parents'id = Column(Integer, primary_key=True)name = Column(String)class Child(Base):__tablename__ = 'children'id = Column(Integer, primary_key=True)name = Column(String)parent_id = Column(Integer, ForeignKey('parents.id', ondelete='CASCADE'))# 创建数据库连接和会话
engine = create_engine('sqlite:///example.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

删除策略

RESTRICT
当父表中的数据被删除时,如果子表中有对应的关联数据,则删除操作会被阻止。RESTRICT是默认的删除策略。

parent_id = Column(Integer, ForeignKey('parents.id', ondelete='RESTRICT'))

NO ACTION
在MySQL中,NO ACTIONRESTRICT相同,当父表中的数据被删除时,若子表中有对应的关联数据,则删除操作会被阻止。

parent_id = Column(Integer, ForeignKey('parents.id', ondelete='NO ACTION'))

CASCADE
当父表中的数据被删除时,子表中所有对应的关联数据也会被删除。

parent_id = Column(Integer, ForeignKey('parents.id', ondelete='CASCADE'))

SET NULL
当父表中的数据被删除时,子表中所有对应的关联数据项会被设置为NULL。

parent_id = Column(Integer, ForeignKey('parents.id', ondelete='SET NULL'))

Flask-sqlalchemy的使用

下面以案例的形式讲解。

from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)def __repr__(self):return f'<User {self.username}>'with app.app_context():db.create_all()@app.route('/add_user/<username>')
def add_user(username):new_user = User(username=username)db.session.add(new_user)db.session.commit()return f'User {username} added.'@app.route('/users')
def get_users():users = User.query.all()return '<br>'.join([user.username for user in users])if __name__ == '__main__':app.run(debug=True)

和常规的sqlalchemy不同的是

  • Flask-sqlalchemy不需要手动创建SQLAlchemy引擎和会话。
  • Flask-sqlalchemy不需要手动绑定和管理Flask的应用上下文。
  • Flask-sqlalchemy不需要手动管理会话的创建和销毁。

下面是sqlalchemy的常规使用

from flask import Flask
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_sessionapp = Flask(__name__)# 配置数据库连接
DATABASE_URI = 'sqlite:///test.db'
engine = create_engine(DATABASE_URI)# 创建会话
Session = scoped_session(sessionmaker(bind=engine))# 基类
Base = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)username = Column(String(80), unique=True, nullable=False)def __repr__(self):return f'<User {self.username}>'with app.app_context():Base.metadata.create_all(engine)@app.route('/add_user/<username>')
def add_user(username):session = Session()try:new_user = User(username=username)session.add(new_user)session.commit()return f'User {username} added.'except Exception as e:session.rollback()return str(e)finally:session.close()@app.route('/users')
def get_users():session = Session()try:users = session.query(User).all()return '<br>'.join([user.username for user in users])finally:session.close()if __name__ == '__main__':app.run(debug=True)

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

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

相关文章

快来!AI绘画Stable Diffusion 3终于开源了,更强的文字渲染和理解力,12G显卡可跑!

大家好&#xff0c;我是设计师阿威 Stable Diffusion 3终于开源了&#xff0c;2B参数的Stable Diffusion 3 Medium模型已经可以在HuggingFace上下载了&#xff01;如无法科学上网的小伙伴我也准备好了网盘资料&#xff0c;请看文末扫描获取哦&#xff01; Stable Diffusion 3 …

PostgreSQL 多表连接不同维度聚合统计查询

摘要:在本文中,你将学习到如何使用 PostgreSQL 完全外连接,从两个或多个表中聚合维度统计数据。 文章目录 一、常用的连接类型图示二、数据库表设计示例三、连接查询示例1. inner join 内连接(不能满足维度统计需求)2. full join 完全外连接(满足维度统计需求)一、常用的…

Vue3【二十】Vue3 路由和组件页面切换

Vue3【二十】Vue3 路由和组件页面切换 Vue3【二十】Vue3 路由和组件页面切换 Vue3 路由的创建 路由的引入 路由的配置 路由的导出 路由的url模式 带# 或不带 案例截图 目录结构 案例代码 app.vue <template><div class"app"><h2 class"title&q…

CPN Tools实现hello world小案例

新建一个net&#xff0c;创建两个输入P1,P2&#xff0c;一个输出P3&#xff0c;一个转换T1&#xff0c;并对输入输出place使用字符串颜色集。&#xff08;这里是左键单击P&#xff0c;然后tab键输入String即可&#xff09;。 为地点指定颜色集需要&#xff1a; 1) 通过左键单击…

定义input_password函数,提示用户输入密码.如果用户输入长度<8,抛出异常,如果用户输入长度>=8,返回输入的密码

def input_password(password):str1passwordlen1len(str1)try:if len1<8:raise ValueError("密码长度不能小于8")else:return print(f"你的密码为:{password},请确认")except ValueError as e:print(f":Error is {e}")number1input("请…

【详解Python文件: .py、.ipynb、.pyi、.pyc、​.pyd !】

今天同事给我扔了一个.pyd文件&#xff0c;说让我跑个数据。然后我就傻了。。 不知道多少粉丝小伙伴会run .pyd代码文件&#xff1f;如果你也懵懵的&#xff0c;请继续往下读吧。。 Python文件是存储Python代码或数据的文本文件&#xff0c;通常以.py作为文件扩展名。这些文件…

KIVY Canvas¶

Canvas Jump to API ⇓ Module: kivy.graphics.instructions Added in 1.0.0 The Canvas is the root object used for drawing by a Widget. Check the class documentation for more information about the usage of Canvas. 画布是一个 基类对象 被用来以一个组件的方式画…

3. 打造个性化可爱怪物表情包:详细步骤教学

表情符号已经成为当今互联网对话中不可或缺的元素&#xff0c;一句话加上一个笑脸符号&#xff0c;语气就大不同。表情符号与我们一道稳步发展&#xff0c;成为鲜活和丰富情感的必要交流工具。通过表情符号&#xff0c;几个像素就能以有趣、清晰、能引起情感共鸣的方式表达我们…

【Python入门与进阶】Python对列表进行排序

在Python中&#xff0c;列表&#xff08;list&#xff09;是一种常用的数据结构&#xff0c;用于存储一系列有序的元素。有多种方法可以对列表进行排序&#xff1a; 使用 sort() 方法&#xff1a; sort() 是列表的一个内建方法&#xff0c;它会在原列表上进行排序&#xff0c;不…

Linux系统编程——进程间通信(管道与共享内存)

目录 一&#xff0c;进程间通信预备 二&#xff0c;匿名管道 2.1 管道原理 2.2 匿名管道原理 2.3 pidof工具 ​编辑 2.4 pipe() 2.6 管道的四种情况 2.8 进程池 三&#xff0c;命名管道 3.1 关于命名管道 3.2 mkfifo命令创建命名管道 3.3 mkfifo系统接口创建命名管…

你好,Jetpack Compose

文章目录 为什么选 Jetpack Compose先决条件新建项目新建虚拟设备运行项目 为什么选 Jetpack Compose Jetpack Compose 是 Android 开发最新的、现代化的 UI 框架开发者几乎只需要使用 Kotlin 一门语言即可完成 App 开发&#xff08;Java 是基础&#xff0c;有些源码是 Java 写…

JS :深拷贝解析与实现(附structuredClone语法测试)

浅拷贝简介 深拷贝是创建一个新对象&#xff0c;这个新对象包含原对象所有属性的全新拷贝&#xff0c;无论是基本数据类型还是引用类型的数据都会被完全复制一份&#xff0c;新旧对象间不存在任何关联&#xff0c;彼此独立。 前言 OK&#xff0c;最近又又又在学习JS的过程中…

SwiftUI六组合复杂用户界面

代码下载 应用的首页是一个纵向滚动的地标类别列表&#xff0c;每一个类别内部是一个横向滑动列表。随后将构建应用的页面导航&#xff0c;这个过程中可以学习到如果组合各种视图&#xff0c;并让它们适配不同的设备尺寸和设备方向。 下载起步项目并跟着本篇教程一步步实践&a…

69. UE5 RPG 使用Gameplay Cue 实现技能表现效果

在上一章中&#xff0c;我们实现了敌人的攻击技能的特效和音效。如果我们在多人模式下打开&#xff0c;发现&#xff0c;其它客户端看不到对应的效果。 造成这种问题的原因是因为敌人的技能是运行在服务器端的&#xff0c;它只复制到拥有它的客户端&#xff0c;而敌人的效果对于…

30、 shell脚本进阶

shell脚本ifcase 一、条件测试 1.1、条件测试&#xff1a;$?----返回码&#xff0c;判断命令或者脚本是否执行成功&#xff08;最近的一条&#xff09; 0 true 为真就是成功 成立 非0 false 失败或者异常。 二、test命令 test命令&#xff1a;可以进行条件测试&#xff…

Python内存管理与垃圾回收机制

目录 一、引言 二、Python内存管理概述 三、引用计数机制 四、垃圾回收机制 标记-清除&#xff08;Mark-and-Sweep&#xff09; 分代收集&#xff08;Generational Collection&#xff09; 五、内存泄漏与优化 六、总结 一、引言 Python作为一门高级编程语言&#xff…

Wells Fargo 借助 MongoDB 推出下一代银行卡支付

MongoDB客户案例导读 MongoDB以其灵活的数据模型、高性能的实时分析能力和可扩展的分布式架构&#xff0c;帮助Wells Fargo富国银行显著提升了数据处理效率和业务响应速度&#xff0c;为其大型机现代化和数字化转型提供了强有力的技术支撑。 金融服务市场正在经历一场变革&am…

像备份Windows一样简单的ghost软件!

数据的安全性对于个人用户和企业来说都至关重要。尤其是运行着重要服务的Linux系统,一旦遇到系统崩溃或硬件故障,如果没有及时的备份,可能会导致不可估量的损失。这时,一款强大而易用的备份还原工具就显得尤为重要。G4L(Ghost for Linux)就是这样一款专为Linux系统设计的…

2024年数字技术与智慧教育国际会议(DTSE 2024,7月26-28)

2024年数字技术与智慧教育国际会议&#xff08;DTSE 2024&#xff09;将于2024年7月26日在广东省广州市召开&#xff0c;本次会议专注于“数字技术与智慧教育”领域&#xff0c; 将汇集全球范围内的学者、研究人员以及教育技术开发者&#xff0c;共同探索和分享该领域内的最新学…

实验12 路由重分布

实验12 路由重分布 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤 一、 原理描述 在大型网络的组建过程中&#xff0c;隶属不同机构的网络部分往往会根据自身的实际情况来选用路由协议。例如&#xff0c;有些网络规模很小&#xff0c;为了管理简单&…