PostgreSQL 02: SQL Basis

SQL 入门 SQL (Structured Query Language) 是关系数据库最重要的操作语言,且影响已经超出了数据库领域,这篇文章介绍基础部分。 语句分类 SQL 命令一般分为 DQL、DML、DDL 三类: DQL: Data Query Language 数据查询语句,基本就是 SELECT 查询命令,用于数据查询。 DML: Data Manipulation Language 数据操纵语言,主要用于插入、更新、删除数据,即 INSERT、UPDATE、DELETE 三类。 DDL: Data Definition Language 数据定义语言,用于创建、删除、修改表、索引等数据库对象的语言。 词法结构 每次执行的 SQL 语句可以由多条 SQL 命令组成,多条 SQL 语句命令之间由分号 (;) 分隔。 SQL 命令由一系列记号组成,这些记号可以由关键字、标识符、双引号包围的标识符、常量和单引号包围的常量组成。 SQL 命令中可以有注释,这些注释在 PostgreSQL 中等同于空白。 例如下面这些 SQL 命令 SELECT * FROM OSDBA_TABLE01; UPDATE OSDBA_TABLE SET COL1 = 64; INSERT INTO OSDBA_TABLE VALUES (232, 'hello osdba'); DDL 语句 使用 psql 会默认连接到和用户名一样的数据库中,也可以使用命令 psql postgres 来连接到默认数据库,或者 creatdb db_name 创建新数据库。 ...

November 7, 2025 · 5 min · 1022 words · Starslayerx

PostgreSQL 01: Introduction

PostgreSQL 的安装与配置 安装 brew 安装后 brew services start postgresql@17 可以启动服务,使用 brew services list 查看服务状态。 也可以通过设定环境变量 export PGDATA=/opt/homebrew/var/postgresql@17 后使用命令 initdb 创建数据库簇,然后 pg_ctl start -D $PGDATA 启动。 停止命令为 pg_ctl stop -D $PGDATA [-m SHOWDOWN-MODE],其中 -m 是服务器停止方法: smart: 等所有连接终止后,关闭数据库。如果客户端连不上,则无法关闭数据库。 fast: 快速关闭数据库,断开客户端连接,让已有的事务回滚,然后关闭数据库。相当于 Oracle 关闭时的 immediate 模式。 immediate: 立即关闭数据库,相当于数据库进程立即停止,直接退出,下次启动数据库需要恢复。相当于 Oracle 关闭时的 abort 模式。 PostgreSQL 数据库中的 immediate 关机模式相当于 Oracle 数据库中的 abort 关机模式,而 Oracle 中的 immediate 关机模式实际上对应的是 PostgreSQL 中的 fast 模式。 配置 PostgreSQL 数据库的配置主要通过修改数据目录下的 postgresql.conf 和 pg_hba.conf 文件来实现的。 ...

November 5, 2025 · 1 min · 198 words · Starslayerx

Fastapi Lifespan Events

Lifespan Events 生命周期事件 通过生命周期事件可以定义在应用开启之前需要执行的代码,这意味着这些代码会在开始接收外部请求之前被执行一次。 同样地,也可以定义应用在关闭的时候定义需要执行的代码,在尽力处理完所有请求后,该代码会被执行一次。 这对于设置需要在整个 app 的请求间共享的资源时非常有用,或者是需要进行清理工作的时候。 例如,一个数据库连接池,或者加载一个共享的机器学习模型。 Use Case 使用示例 下面通过一个例子说明如何使用。 假如你有一个机器学习模型,并且需要让其处理请求,由于请求都共享同一个模型,因此不是一个请求对应一个模型,或一个用户一个模型。 假设模型加载需要一定的时间,因为要从磁盘中读取大量的数据,因此不能每个请求都去加载一次。 你可以在顶层的模块文件中定义加载,但这意味着当进行简单的自动化测试的时候,也会加载该模型,这样就会很慢。 这就是需要解决的问题,需要在请求响应之前加载模型,也不是在代码被加载的时候加载模型。 Lifespan 生命周期 可以通过在 FastAPI app 中使用 lifespan 参数来定义启动和关闭逻辑,以及一个 “context manager” (上下文管理器)。 通过下面这种方法创建一个含 yield 的 function from contextlib import asynccontextmanager from fastapi impor FastAPI def fake_answer_to_everything_ml_model(x: float): return x * 42 ml_models = {} @asynccontextmanager async def lifespan(app: FastAPI): # Load the ML model ml_models["answer_to_everything"] = fake_answer_to_everything_ml_model yield # Clean up the ML models and release the resources ml_models.clear() app = FastAPI(lifespan=lifespan) @app.get("/predict") async def predict(x: float): result = ml_models["answer_to_everything"](x) return {"result": result} 这里在生成器 yield 之前将模拟的昂贵函数放入机器学习字典中。 这段代码将在应用程序接收请求之前执行,即启动阶段。 ...

October 24, 2025 · 2 min · 245 words · Starslayerx

Morden Javascript Tutorial Chapter 3.1 - Code Quailty

3.1 Debugging in the browser Debugging is the process of finding and fixing errors with a script. All morden browsers and most other environments support debugging tools - a special UI in developer tools that makes debugging much easier. It also allows to trace the code step by step to see what exactly is going on. The “Sources” panel The Sources panel has 3 parts: The File Navigator pane lists HTML, Javascript, CSS and other files, including images that are attatched to the page. Chrome extensions may appera here too. The Code Editor pane shows the source code. The Javascript Debugging pane is for debugging, we’ll explore it soon. Console 按 Esc 可以打开控制台,在其中可以输入命令,按回车执行。 ...

October 23, 2025 · 1 min · 189 words · Starslayerx

Understanding SVG Paths

Overview 如果你曾经看过一个 icon 的 SVG 代码,你可能会注意到他们通常是有一个 <path> 元素和一个神秘的 d 属性实现的。 你可能以为他们不过是设计师最喜欢的矢量图形编辑器的输出,虽然可能是正确的,但有些过度简化了。 理解这个属性的内部运作机制将是前端技能的一大助力,它让你能够做到以前从未想过的事情,比如制作弯曲的动画。 这份指南将会谈到 d 属性,也被称为 path data。 A Path is a Series of Commands 路径是一系列命令 d 属性实际上是一系列命令,告诉浏览器如何绘制 path,如果将属性内容规范一下,将会是下面这样: M 12.0 7.2 C 10.5 5.6 8.1 5.2 6.3 6.7 C 4.5 8.1 4.2 10.6 5.7 12.4 L 12.0 18.3 L 18.3 12.4 C 19.7 10.6 19.5 8.1 17.7 6.7 C 15.8 5.2 13.4 5.6 12.0 7.2 Z 为了绘制出 path,浏览器按照顺序执行这些命令,每个命令绘制一小部分。 所有的 path 命令都遵循同样的语法,单个字母 + 一系列数字,字母代表命令类型,二数字则是命令的参数。 ...

October 22, 2025 · 8 min · 1618 words · Starslayerx

Fastapi Background Tasks

Background Tasks 后台任务 你可以定义一个在返回响应之后运行的后台任务。 这对请求之后执行一些操作十分有用,客户端无需一直等待操作任务完成再接收响应。 这包含一些例子: 执行操作后发送电子邮件 由于连接邮件服务器并发送邮件一般会比较“慢”(几秒钟),你可以立刻返回响应并在后台发送邮件请求。 处理数据 例如,你收到了一个文件需要缓慢处理,你可以返回一个 “Accepted” 响应 (HTTP 202) 并在后台处理文件。 Using Background Tasks 使用后台任务 首先要导入 BackgroundTasks 并在执行函数中定义一个路径参数,使用 BackgroundTasks 类型声明。 from fastapi import BackgroundTasks, FastAPI app = FastAPI() def write_notification(email: str, message=""): with open("log.txt", mode="w") as email_file: content = f"notification for {email}: {message}" email_file.write(content) @app.post("/send-notification/{email}") async def send_notification(email: str, backgroud_tasks: Background(Tasks): # Add parameter here background_tasks.add_task(write_notification, email, message="some notification") # add backgroud task here return {"message": "Notification sent in the background"} Create a task function 创建任务函数 创建一个函数放到后台运行,只是一个接收参数的基本函数,可以是 async def 或者就普通的 def 函数,FastAPI 会正确的处理它。 在这个例子中的任务函数将会编写文件,并且写入操作不使用 async 或 await 故使用 def 定义了一个基本的函数。 ...

October 10, 2025 · 2 min · 261 words · Starslayerx

Fastapi Middleware

Middleware 你可以添加中间件到 FastAPI 应用中。 “中间件” 是一个函数,它在每个请求被特定路径操作之前对其进行处理,同时在每个响应返回之前也对其进行处理。 在到达应用程序之前处理请求 可以在请求中做一些事情,或运行任何需要的代码 将处理后的请求传递给应用程序 之后处理应用程序返回的响应 可以对响应做一些事情,或运行任何需要的代码 然后返回响应 Create a Middleware 创建一个中间件 想要创建一个中间件,你可以在函数上面使用装饰器 @app.middleware("http"),该函数接受: request 请求 一个函数 call_next 并将会接收 request 作为一个参数 该函数会将 request 传递给对应的路径操作 然后返回对应路由操作生成的 response 你可以修改或者直接返回 response import time from fastapi import FastAPI, Request app = FastAPI() @app.middleware("http") async def add_process_time_header(request: Request, call_next): ... TIP 自定义专属 headers 可以使用 X-prefix 来添加。 但如果你有一个自定义的 header 并想要客户端能够看到这些信息,你需要使用 Starlette’s CORS docs 中的参数参数 expose_headers 将其加入你的 CORS 设置里 (CORS (Corss-Origin Resource Sharing))。 Before and after the response 在响应前后 你也可以在 request 前后运行代码,也可以在 response 前后运行代码。 ...

October 9, 2025 · 1 min · 164 words · Starslayerx

Python Standrad Library - File and Directory Access - pathlib

pathlib - Object-oriented filesystem paths 此模块提供表示文件系统路径的类,其语义适用于不同的操作系统。 路径类分为: 用于纯计算无 I/O 的 pure paths 继承 pure paths 但是有 I/O 操作的 concrete paths 基本使用 导入 Path from pathlib import Path p = Path('.') 列出所有子目录 [x for x in p.iterdir() if x.is_dir()] 列出所有 py 源码文件 list(p.glob('**/*.py')) 在目录树中移动 p = Path('/etc') q = p / 'init.d' / 'reboot' # .resolve() 方法会解析所有符号链接,返回文件绝对路径 # mac os 中的 /etc 实际上是一个符号链接,指向 /private/etc q.resolve() 查询文件路径 q.exists() # 文件是否存在 q.is_dir() # 是否为目录 打开一个文件 q = Path('.') / 'file.py' with q.open() as f: # 读取第一行内容 f.readline() Pure paths 纯路径 Pure path 对象提供路径处理操作,这些操作无需真的访问操作系统。 有三种方法来操作这些类,也被称为 flavours (风格): class pathlib.PurePath(*pathsegemnts) 为一个通用的类,代表当前系统的路径风格 >>> PurePath('setup.py') PurePosixPath('setup.py') pathsegments 的每个元素即可以是代表一个路径的字符串,也可以是实现了 os.PathLike 接口的对象,其中 fspath() 方法返回一个字符串,例如另一个路径对象: ...

October 3, 2025 · 9 min · 1706 words · Starslayerx

Docker - Containers

像 VMware 或 KVM 这类虚拟化系统, 他们运行在虚拟化层上运行完整的 Linux 内核与操作系统. 这种架构能提供极强的隔离性, 因为每个虚拟机都搭载独立的内核, 这些内核各自运行在硬甲虚拟化层之上的隔离内存空间中. 而容器技术有着根本性差异, 所有容器共享同一个内核, 工作负载间的隔离性全通过内核机制实现, 这种模式被称为操作系统级虚拟化 operating system virtualization. runc/libcontainer 提供了一个很好的定义: A container is a self-contained execution environment that shares the kernel of the host system and is isolated from other containers in the system. 容器最大的优势就在于性能, 当运行一个进程的时候, 只有小部分的代码在内核中用于管理容器. 如今, 容器几乎在任何地方运行. Docker 和 OCI 镜像提供了生成环境中软件的打包格式, 并为 Kubernetes 和大多数 “serverless” 云技术打下了基础. 所谓的 serverless 技术并不是真的没有服务器: 它们依赖其他人的服务器来完成工作, 这样应用开发者就无需关心管理硬甲和操作系统了. Creating a Container 创建容器的命令 docker container run 实际上是包装在一起的两条命令. 第一件事是从基本的镜像中创建一个容器, 可以通过 docker container create 命令实现. 第二件事是执行容器, 同样地, 可以通过 docker container start 命令实现. ...

September 23, 2025 · 9 min · 1877 words · Starslayerx

uv - Python package manager

这篇文章深入介绍 uv 管理 Python 项目的使用 Features Python versions uv python install: 安装 Python 版本 uv python list: 查看可用的 Python 版本 uv python find: 查找安装的 Python 版本 uv python pin: 固定当前项目的 Python 版本 uv python uninstall: 卸载一个 Python 版本 Scripts uv run: 运行一个脚本 uv add --script: 为脚本添加一个依赖 uv remove --script: 移除一个依赖 Projects 使用 pyproject.toml 配置项目 uv init: 创建一个 Python 项目 uv add: 为项目添加依赖 uv remove: 删除项目依赖 uv sync: 同步环境下的依赖 uv lock: 为项目依赖创建一个锁文件 uv run: 在项目环境执行命令 uv tree: 查看项目依赖树 uv build: 将项目构建为分发归档文件 uv publish: 将项目发布到包索引 Tools 允许与安装工具 ...

September 22, 2025 · 11 min · 2131 words · Starslayerx