Rich 使用PY在终端上展示富文本界面

安装 pip install rich # PDM pdm add rich 文档 & 源码 基础 from rich import print print("Hello World") Rich功能非常丰富,从日志处理到富文本显示甚至动态的终端界面。 要使用Rich用做界面的话,一般是这样的: from rich.console import Console from rich.layout import Layout from rich.panel import console = Console() panel = Panel(name="panel_name") layout = Layout(panel,name="layout_name") 界面Layout和面板Panel是经常要用到的东西,Layout作为界面布局,Panel内展示元素并风格化,比如经常使用的表格Table;要实现动态变化而不是print需要用到Live。 ...

2023-07-28 · 3 min · 1427 words · kutake

一个PY多数据源的统一入口思路

需求 以我的bot来说: Bot: ├─config ├─core ├─modules │ ├─required │ │ ├─BotManager │ │ ├─BotStatus │ │ ├─ExceptionCatch │ │ ├─... │ └─self │ ├─Modules1 │ ├─Modules2 │ ├─... ├─resources ├─service └─utils 模块统一放在modules下,required是bot运行必须的模块,self是可卸载安装的模块。 ...

2023-04-21 · 3 min · 1114 words · kutake

Redis持久化策略

Redis是一种高性能的内存数据库,它支持多种数据结构,如字符串、列表、集合、散列、有序集合等。Redis的优点是速度快,操作简单,功能丰富,但是它也有一个缺点,就是数据都存储在内存中,一旦服务器宕机或者重启,数据就会丢失。为了解决这个问题,Redis提供了两种持久化机制,分别是RDB(快照)和AOF(追加文件)。 ...

2023-04-14 · 2 min · 670 words · kutake

docker多阶段构建

非多阶段 以node项目为例: FROM alpine RUN mkdir -p /opt/app WORKDIR /opt/app COPY package.json package-lock.json ./ RUN apk add --no-cache --update nodejs npm RUN apk add --no-cache \ gcc \ g++ \ python3=3.10.10-r0 \ make=4.3-r1 \ pkgconf COPY . . RUN npm install --production EXPOSE 8080 CMD ["node", "main.js"] 这样虽然可以使用,但是很多依赖是生产环境下不需要受用的,比如build阶段的gcc以及npm等等 ...

2023-03-11 · 1 min · 417 words · kutake

sqlalchemy&sqlmodel的commit后数据丢失问题

描述 print(user) # name=user,age=18, ... session.commit() print(user) # empty 原因 sqlalchemy为了保持session内的数据同步,默认了expire_on_commit为True,它表现在: # 查询 b = session.query(User).filter(User.id==2).first() # 更改数据 b.name = "user_b" session.add(b) session.flush() session.commit() # commit后再次访问,其实是重新进行了select操作 b.name # user_b expire_on_commit可以用来更改 SQLAlchemy 的对象刷新机制,默认值为True即在session调用commit之后会主动将同一个session在commit之前查询得到的 ORM 对象的_sa_instance_state.expire属性设置为Flase,再次读取该对象属性时将重载这个对象,方法是重新调用之前的查询语句。 ...

2023-03-11 · 1 min · 366 words · kutake

sqlmodel单与多数据库连接

连接单个数据库 from typing import Optional from sqlmodel import Field, Session, SQLModel, create_engine # 表 class Hero(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) name: str secret_name: str age: Optional[int] = None # 连接 engine = create_engine("sqlite:///database.db") # 建表 SQLModel.metadata.create_all(engine) 连接多个数据库 from typing import Optional from sqlmodel import Field, Session, SQLModel, create_engine from sqlmodel.main import registry # 表1 table1 = registry() class Hero1(SQLModel, table=True, registry=table1): id: Optional[int] = Field(default=None, primary_key=True) name: str secret_name: str age: Optional[int] = None # 表2 table2 = registry() class Hero2(SQLModel, table=True, registry=table2): id: Optional[int] = Field(default=None, primary_key=True) name: str secret_name: str age: Optional[int] = None # 连接1 engine1 = create_engine("sqlite:///database1.db") # 连接2 engine2 = create_engine("sqlite:///database2.db") # 建表1 Hero1.metadata.create_all(engine1) # 建表2 Hero2.metadata.create_all(engine2) 一点优化 显然这样建多表会很麻烦,一种优化方案是: ...

2023-03-11 · 1 min · 279 words · kutake

sqlalchemy异步与同步方式获取自增id

同步 # sync_session # example(id, name) e = example(name="name1") db.add(e) db.flush() print(e.id) # id = 1 异步 # async_session # example(id, name) e = example(name="name1") db.add(e) await db.flush() await db.commit() await db.refresh(e) print(e.id) # id = 1

2023-01-05 · 1 min · 39 words · kutake

[myabtis-plus]XML中返回的id顺序问题

问题 <insert id="insertListIfNotExists" useGeneratedKeys="true" keyProperty="id"> INSERT IGNORE INTO `tag` (name, create_time) VALUES <foreach collection="list" item="item" separator=","> (#{item.name}, #{item.createTime}) </foreach> </insert> useGeneratedKeys与INSERT IGNORE配合后,若插入顺序是 id:1 name: name1 id: null name: name2 id: null name: name3 返回的id会变成 ...

2022-12-22 · 1 min · 102 words · kutake

[myabtis-plus]xml中的字段注入不生效

未声明则不插入 create_time是自动注入字段 xml是最终执行的sql命令,未声明加入则不会插入 <insert id="insertListIfNotExists" useGeneratedKeys="true" keyProperty="id"> INSERT IGNORE INTO `tag` (name) VALUES <foreach collection="list" item="item" separator=","> (#{item.name}) </foreach> </insert> 修改: <insert id="insertListIfNotExists" useGeneratedKeys="true" keyProperty="id"> INSERT IGNORE INTO `tag` (name, create_time) VALUES <foreach collection="list" item="item" separator=","> (#{item.name}, #{item.createTime}) </foreach> </insert>

2022-12-22 · 1 min · 89 words · kutake

bot的一些反思

模块化 我现在是这样的 Bot: └─config └─db └─modules └─utils config内包含所有模块用到的配置项 db内是实体类和业务语句的集合 utils内是一些公共工具 现在问题是,config与db非常难维护,一打开就是几百行语句,找起来都麻烦,数据库和配置项有一点不对整个bot就无法启动 ...

2022-09-25 · 2 min · 800 words · kutake