【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式

引言

掌握了数据库基本运作之后,要进一步学习"存储方面的表空间"和"逻辑方面的模式",表空间用于规划数据文件的物理存储路径,模式则承担数据库对象(表,视图等)的逻辑隔离功能,二者关联起来可使本地 KingbaseES 数据库的运作更为高效,安全。本文将分两部分细致阐述表空间与模式的创建,查看,使用以及删除流程,并在各步骤给予实际操作案例和防错指引。

文章目录

  • 引言
    • [一、表空间管理:给数据 "找个合适的存储位置"](#一、表空间管理:给数据 “找个合适的存储位置”)
      • [1.1 前置准备:确认存储路径与权限](#1.1 前置准备:确认存储路径与权限)
        • [1.1.1 1. 创建本地存储路径(以 Linux 为例)](#1.1.1 1. 创建本地存储路径(以 Linux 为例))
        • [1.1.2 2. Windows 系统路径准备](#1.1.2 2. Windows 系统路径准备)
      • [1.2 创建表空间:用 CREATE TABLESPACE 语句](#1.2 创建表空间:用 CREATE TABLESPACE 语句)
        • [1.2.1 1. 基础语法](#1.2.1 1. 基础语法)
        • [1.2.2 2. 实操示例:创建 test_ts 表空间](#1.2.2 2. 实操示例:创建 test_ts 表空间)
        • [1.2.3 3. 进阶:指定表空间所有者](#1.2.3 3. 进阶:指定表空间所有者)
      • [1.3 查看表空间:了解存储状态](#1.3 查看表空间:了解存储状态)
        • [1.3.1 1. 查看所有表空间列表(\db 命令)](#1.3.1 1. 查看所有表空间列表(\db 命令))
        • [1.3.2 2. 查看表空间详情(\db+ 命令)](#1.3.2 2. 查看表空间详情(\db+ 命令))
      • [1.4 使用表空间:给表指定存储位置](#1.4 使用表空间:给表指定存储位置)
        • [1.4.1 1. 示例:在 test_ts 表空间创建表](#1.4.1 1. 示例:在 test_ts 表空间创建表)
        • [1.4.2 2. 验证表的表空间归属](#1.4.2 2. 验证表的表空间归属)
      • [1.5 修改与删除表空间:管理存储生命周期](#1.5 修改与删除表空间:管理存储生命周期)
        • [1.5.1 1. 修改表空间(ALTER TABLESPACE)](#1.5.1 1. 修改表空间(ALTER TABLESPACE))
        • [1.5.2 2. 删除表空间(DROP TABLESPACE)](#1.5.2 2. 删除表空间(DROP TABLESPACE))
          • [步骤 1:检查表空间下的对象](#步骤 1:检查表空间下的对象)
          • [步骤 2:执行删除命令](#步骤 2:执行删除命令)
      • [1.6 表空间常见问题排查](#1.6 表空间常见问题排查)
        • [问题 1:创建表空间报错 "目录权限被拒绝"](#问题 1:创建表空间报错 “目录权限被拒绝”)
        • [问题 2:删除表空间报错 "表空间非空"](#问题 2:删除表空间报错 “表空间非空”)
    • [二、模式管理:给数据库对象 "建个逻辑文件夹"](#二、模式管理:给数据库对象 “建个逻辑文件夹”)
      • [2.1 为什么需要模式?新手必懂的核心作用](#2.1 为什么需要模式?新手必懂的核心作用)
      • [2.2 创建模式:用 CREATE SCHEMA 语句](#2.2 创建模式:用 CREATE SCHEMA 语句)
        • [2.2.1 1. 基础创建:仅指定模式名](#2.2.1 1. 基础创建:仅指定模式名)
        • [2.2.2 2. 进阶创建:指定所有者](#2.2.2 2. 进阶创建:指定所有者)
        • [2.2.3 3. 特殊场景下,要创建模式并且授权](#2.2.3 3. 特殊场景下,要创建模式并且授权)
      • [2.3 查看模式以了解逻辑隔离状态](#2.3 查看模式以了解逻辑隔离状态)
        • [2.3.1 1. 在ksql交互模式当中,输入\dn这个命令](#2.3.1 1. 在ksql交互模式当中,输入\dn这个命令)
        • [2.3.2 2. 查看模式下的对象](#2.3.2 2. 查看模式下的对象)
      • [2.4 使用模式:切换与访问对象的关键](#2.4 使用模式:切换与访问对象的关键)
        • [2.4.1 1. 查看当前模式搜索路径](#2.4.1 1. 查看当前模式搜索路径)
        • [2.4.2 2. 更改模式搜索路径,这非常重要,以免找不到对象](#2.4.2 2. 更改模式搜索路径,这非常重要,以免找不到对象)
        • [2.4.3 3. 在模式下创建表](#2.4.3 3. 在模式下创建表)
        • [2.4.4 4. 访问模式下的表](#2.4.4 4. 访问模式下的表)
      • [2.5 模式权限控制:精细化管理访问权限](#2.5 模式权限控制:精细化管理访问权限)
        • [2.5.1 1. 授予模式权限(GRANT)](#2.5.1 1. 授予模式权限(GRANT))
        • [2.5.2 2. 撤销模式权限(REVOKE)](#2.5.2 2. 撤销模式权限(REVOKE))
      • [2.6 修改与删除模式:管理逻辑隔离生命周期](#2.6 修改与删除模式:管理逻辑隔离生命周期)
        • [2.6.1 1. 修改模式(ALTER SCHEMA)](#2.6.1 1. 修改模式(ALTER SCHEMA))
        • [2.6.2 2. 删除模式(DROP SCHEMA)](#2.6.2 2. 删除模式(DROP SCHEMA))
          • [步骤 1:确认模式下的对象](#步骤 1:确认模式下的对象)
          • [步骤 2:执行删除命令](#步骤 2:执行删除命令)
      • [2.7 模式常见问题排查](#2.7 模式常见问题排查)
        • [问题 1:找不到模式下的表,报错 "关系对象不存在"](#问题 1:找不到模式下的表,报错 “关系对象不存在”)
        • [问题 2:无权限访问模式,报错 "模式权限被拒绝"](#问题 2:无权限访问模式,报错 “模式权限被拒绝”)
    • 三、总结:表空间与模式的配合使用

一、表空间管理:给数据 "找个合适的存储位置"

表空间在KingbaseES中的"物理存储"体系里属于核心概念,其本质上就是指定数据库文件的存放目录,可以将经常读写的大表安排到高速磁盘所对应的表空间当中,而不常被用到的归档数据则放在普通磁盘所对应的表空间里面,从而来提升磁盘的IO性能,文档里面已经明确了表空间的各项操作步骤,接下来就按照"创建 - 查看 - 使用 - 修改/删除"的顺序展开说明。

1.1 前置准备:确认存储路径与权限

创建表空间之前需满足两个条件,其一,本地存储路径应当事先存在;其二,KingbaseES 的运行用户(默认为 kingbase 用户)要对该路径具备读写权限,此前提在文档中被多次提及,若不然将会出现"权限不足"的错误提示。

1.1.1 1. 创建本地存储路径(以 Linux 为例)

假设我们要创建一个名为 test_ts 的表空间,计划将数据文件存放在 /opt/kingbase/tablespace/test_ts 目录,执行以下命令创建路径(需 root 或有 sudo 权限):

bash 复制代码
# 1. 创建多级目录
mkdir -p /opt/kingbase/tablespace/test_ts
# 2. 给 kingbase 用户授权(关键!否则数据库无法读写该路径)
chown -R kingbase:kingbase /opt/kingbase/tablespace/test_ts
chmod -R 755 /opt/kingbase/tablespace/test_ts
  • mkdir -p:创建多级目录,即使上级目录不存在也能成功;
  • chown -R:将路径的所有者改为 kingbase 用户(数据库运行用户);
  • chmod -R 755:确保 kingbase 用户有读、写、执行权限,其他用户有读和执行权限。
1.1.2 2. Windows 系统路径准备

若为 Windows 系统,计划将表空间路径设为 D:\Tools\Kingbase\ES\tablespace\test_ts,操作如下:

  1. 手动在资源管理器中创建该目录;

  2. 右键目录→"属性"→"安全"→添加 kingbase 用户(若未创建,需先在 "计算机管理" 中创建),并授予 "完全控制" 权限。

1.2 创建表空间:用 CREATE TABLESPACE 语句

1.2.1 1. 基础语法
sql 复制代码
CREATE TABLESPACE 表空间名 LOCATION '本地存储路径';
  • 表空间名:自定义名称(如 test_ts,需符合标识符规则,不能含特殊字符);
  • LOCATION '本地存储路径':必须是提前创建好的路径(如 Linux 的 /opt/kingbase/tablespace/test_ts,Windows 的 'D:/Kingbase/tablespace/test_ts',注意 Windows 路径用 /\\)。
1.2.2 2. 实操示例:创建 test_ts 表空间
  1. 先通过 ksql 连接本地数据库(如连接 kingbase 库):

    bash 复制代码
    ksql -d kingbase -U system
  2. 执行创建表空间命令(Linux 系统):

    sql 复制代码
    CREATE TABLESPACE test_ts LOCATION '/opt/kingbase/tablespace/test_ts';

    若为 Windows 系统,命令如下(路径用 / 分隔):

    sql 复制代码
    CREATE TABLESPACE test_ts LOCATION 'D:\Tools\Kingbase\ES\tablespace\test_ts';
  3. 成功验证:执行后若提示 CREATE TABLESPACE,表示表空间创建成功(ksql 对成功的 DDL 语句仅返回操作类型)。

1.2.3 3. 进阶:指定表空间所有者

表空间的默认所有者为当前创建用户(比如 system),如果想要将其他用户(譬如 user1)设为所有者,可以加上 OWNER 这个选项。

sql 复制代码
CREATE TABLESPACE test_ts LOCATION '/opt/kingbase/tablespace/test_ts' OWNER user1;

这适用于多用户协作场景,确保表空间的权限归属清晰。

1.3 查看表空间:了解存储状态

创建表空间之后,要利用 ksql 命令来查看表空间列表及其详细情况,以此确认路径,大小等相关信息,建议采用 \db 这一系列命令。

1.3.1 1. 查看所有表空间列表(\db 命令)

在 ksql 交互模式下,执行以下命令,可列出本地所有表空间的核心信息:

sql 复制代码
\db

执行后会显示类似以下的表格(示例):

1.3.2 2. 查看表空间详情(\db+ 命令)

若需了解表空间的 "大小、使用情况" 等详细信息,在 \db 后加 +,语法如下:

sql 复制代码
\db+ 表空间名

示例:查看 test_ts 的详情:

sql 复制代码
\db+ test_ts

执行后会显示类似以下的信息:

1.4 使用表空间:给表指定存储位置

创建表空间的终极目标是"把表,索引等对象存储到指定路径",文档表明经由使用TABLESPACE选项来指定表空间即可达成创建表时的需求。

1.4.1 1. 示例:在 test_ts 表空间创建表

如果我们要形成一个叫 user_info 的表,并且规定它的数据文件位于 test_ts 表空间当中,可以参考下面这条命令

sql 复制代码
CREATE TABLE user_info (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT
) TABLESPACE test_ts;
  • TABLESPACE test_ts:关键选项,指定表的存储表空间;
  • 执行之后会提示 CREATE TABLE,这表明表已在 test_ts 表空间创建成功。
1.4.2 2. 验证表的表空间归属

创建表后,可通过 \d+ 命令查看表的详情,确认表空间是否正确:

sql 复制代码
\d+ user_info

1.5 修改与删除表空间:管理存储生命周期

当表空间的路径需要调整,或不再使用时,需执行修改或删除操作,文档中明确了相关语法和注意事项。

1.5.1 1. 修改表空间(ALTER TABLESPACE)

常用的修改操作包括 "重命名" 和 "修改所有者",语法如下:

  • 重命名表空间

    sql 复制代码
    ALTER TABLESPACE test_ts RENAME TO new_test_ts;

    示例中将 test_ts 重命名为 new_test_ts,执行后提示 ALTER TABLESPACE,重命名后原表空间下的表会自动归属到新表空间名(存储路径不变)。

  • 修改表空间所有者

    sql 复制代码
    ALTER TABLESPACE new_test_ts OWNER TO user1;

    将表空间所有者从 system 改为 user1,适用于权限交接场景。

1.5.2 2. 删除表空间(DROP TABLESPACE)

删除表空间属于"高危操作",要保证表空间下没有表,索引之类的任何对象,不然会出现错误,文档里建议先查看表空间的使用状况,然后再去做删除操作。

步骤 1:检查表空间下的对象

执行以下 SQL 语句,查看 new_test_ts 表空间下是否有表

sql 复制代码
SELECT tablename FROM pg_tables WHERE tablespace = 'new_test_ts';

若返回空结果,说明无表;若有表,需先删除表或迁移表到其他表空间(如 ALTER TABLE 表名 SET TABLESPACE pg_default;)。

步骤 2:执行删除命令

确认无对象后,执行删除命令(建议加 IF EXISTS 避免删除不存在的表空间报错):

sql 复制代码
DROP TABLESPACE IF EXISTS new_test_ts;

执行后提示 DROP TABLESPACE,表示删除成功,同时本地存储路径会被保留(需手动删除路径,数据库不会自动删除物理目录)。

1.6 表空间常见问题排查

文档中提到了表空间操作的典型报错,以下是两种高频问题及解决方案:

问题 1:创建表空间报错 "目录权限被拒绝"

报错信息

plaintext 复制代码
ERROR:  could not set permissions on directory "/opt/kingbase/tablespace/test_ts": Permission denied

原因kingbase 用户对存储路径无读写权限。
解决方案:重新执行权限授权命令(Linux 为例):

bash 复制代码
chown -R kingbase:kingbase /opt/kingbase/tablespace/test_ts
chmod -R 755 /opt/kingbase/tablespace/test_ts
问题 2:删除表空间报错 "表空间非空"

报错信息

plaintext 复制代码
ERROR:  tablespace "test_ts" is not empty

原因 :表空间下仍有表、索引等对象。
解决方案:先删除或迁移对象,再执行删除命令(参考 1.5.2 步骤 1)。

二、模式管理:给数据库对象 "建个逻辑文件夹"

模式是 KingbaseES 中"逻辑隔离"的核心概念,它类似于数据库里的"文件夹",可以将不同用户的表,视图等对象分开存储,比如 user1 的表放在 schema_user1 模式下,user2 的表放在 schema_user2 模式下,即便表名相同也不会产生冲突,文档里对模式的操作流程有着清晰的阐述,我们按照"创建 - 查看 - 使用 - 权限 - 修改删除"的顺序来展开讲解。

2.1 为什么需要模式?新手必懂的核心作用

在没有创建自定义模式的时候,所有的表会默认保存在 public 模式下(这是系统默认的模式),如果很多用户共同使用一个数据库,就很可能产生"表名冲突"的情况(譬如说两个用户都想创建 user 表),而模式的关键意义就在于此:

  1. 对象隔离:不同模式下的对象(表、视图)可重名,互不干扰;
  2. 权限控制方面 ,可以向不同用户赋予不同模式的权限,譬如仅仅允许user1访问schema_user1
  3. 管理非常明晰 ,按照业务模块划分的方式,比如schema_order用于存储订单表,schema_user用于存储用户表。

2.2 创建模式:用 CREATE SCHEMA 语句

文档中给出了模式的创建语法,支持指定所有者、默认权限等,以下是基础和进阶示例:

2.2.1 1. 基础创建:仅指定模式名

在 ksql 交互模式下,执行以下命令创建名为 test_schema 的模式(默认所有者是当前用户):

sql 复制代码
CREATE SCHEMA test_schema;

执行后提示 CREATE SCHEMA,表示创建成功,该模式会归属到当前连接用户(如 system)。

2.2.2 2. 进阶创建:指定所有者

若需创建一个归属 user1 的模式(让 user1 拥有该模式的所有权限),可添加 AUTHORIZATION 选项:

sql 复制代码
CREATE SCHEMA test_schema AUTHORIZATION user1;

该命令适用于 "管理员为普通用户创建专属模式" 的场景,避免后续权限配置的麻烦。

2.2.3 3. 特殊场景下,要创建模式并且授权

如果在创建模式的时候还要向其他用户赋予这种模式的使用权,可以利用 GRANT 语句来实现

sql 复制代码
-- 1. 创建模式,所有者为 system
CREATE SCHEMA test_schema;
-- 2. 给 user1 授予 test_schema 的使用权限和表查询权限
GRANT USAGE, SELECT ON ALL TABLES IN SCHEMA test_schema TO user1;

2.3 查看模式以了解逻辑隔离状态

建模式之后,要利用 ksql 命令来查看模式列表与详情,从而确认创建结果,文档里建议采用 \dn 这一系列命令

2.3.1 1. 在ksql交互模式当中,输入\dn这个命令

在ksql交互模式当中,输入\dn这个命令,就可以显示当前数据库里面包含的所有模式

sql 复制代码
\dn

执行后会显示类似以下的表格(示例):

2.3.2 2. 查看模式下的对象

若需了解 test_schema 模式下有哪些表,执行以下命令:

sql 复制代码
-- 方法1:ksql 专用命令(简洁)
\dt test_schema.*
-- 方法2:SQL 语句(详细)
SELECT tablename FROM pg_tables WHERE schemaname = 'test_schema';
  • \dt test_schema.*:显示 test_schema 模式下的所有表;
  • 若模式下无表,会提示 No relations found.,属于正常情况。

2.4 使用模式:切换与访问对象的关键

切换到访问对象的关键创建模式之后,要想在这个模式里创建表或者访问表,首先得知道"模式搜索路径"这个概念,KingbaseES 会按照搜索路径的顺序去查找相关对象,这个地方新手很容易出错

2.4.1 1. 查看当前模式搜索路径

执行以下命令,查看当前的搜索路径:

sql 复制代码
SHOW search_path;

默认搜索路径为:

plaintext 复制代码
search_path = "$user", public
  • "$user":有一个优先查找与当前用户名同名的模式的情况,比如说当下用户叫 user1,那么它会首先找 user1 这个模式
  • public:如果没有找到同名模式,就要找 public 模式
2.4.2 2. 更改模式搜索路径,这非常重要,以免找不到对象

如果希望优先访问 test_schema 模式中的对象,可以更改搜索路径

sql 复制代码
-- 方法1:临时修改(当前会话有效)
SET search_path TO test_schema, public;
-- 方法2:永久修改(当前用户所有会话有效)
ALTER USER current_user SET search_path TO test_schema, public;
  • 临时的,关闭 ksql 就会失效,比较适合临时操作。

  • 永久修改:需重新连接 ksql 生效,适合长期使用某模式的场景。

    显示SET表示修改成功

2.4.3 3. 在模式下创建表

修改搜索路径后,直接创建表会默认存放在 test_schema 模式:

sql 复制代码
CREATE TABLE user_info (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);

若未修改搜索路径,需在表名前加 "模式名。表名" 指定模式:

sql 复制代码
CREATE TABLE test_schema.user_info (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);

两种方式创建的表都会归属到 test_schema 模式,可通过 \dt test_schema.* 验证。

2.4.4 4. 访问模式下的表

访问模式下的表时,有两种方式:

  • 修改搜索路径后:直接用表名访问(搜索路径会自动匹配模式)

    sql 复制代码
    SELECT * FROM user_info;
  • 未修改搜索路径:需加 "模式名。表名" 全称访问:

    sql 复制代码
    SELECT * FROM test_schema.user_info;

2.5 模式权限控制:精细化管理访问权限

模式的权限控制是其核心价值之一,包括如何通过 GRANT(授予)和 REVOKE(撤销)命令管理权限,常用权限包括 USAGE(访问权限)、CREATE(创建对象权限)、SELECT(查询表权限)等。

2.5.1 1. 授予模式权限(GRANT)

示例 1:给 user1 授予 test_schema 的 "访问权限" 和 "表查询权限":

sql 复制代码
-- 1. 授予访问模式的权限(必须有,否则无法看到模式下的对象)
GRANT USAGE ON SCHEMA test_schema TO user1;
-- 2. 授予查询模式下所有表的权限
GRANT SELECT ON ALL TABLES IN SCHEMA test_schema TO user1;

示例 2:给 user1 授予 "在模式下创建表的权限":

sql 复制代码
GRANT CREATE ON SCHEMA test_schema TO user1;

授予后 user1 可在 test_schema 下创建表,但不能修改其他用户的表。

2.5.2 2. 撤销模式权限(REVOKE)

若需收回 user1test_schema 的查询权限,执行以下命令:

sql 复制代码
REVOKE SELECT ON ALL TABLES IN SCHEMA test_schema FROM user1;

撤销后 user1 仍能看到模式下的表,但无法查询数据,实现 "可见不可查" 的控制。

2.6 修改与删除模式:管理逻辑隔离生命周期

当模式名称需要调整或不再使用时,可执行修改或删除操作,文档中明确了相关语法和注意事项。

2.6.1 1. 修改模式(ALTER SCHEMA)

常用的修改操作是 "重命名",语法如下:

sql 复制代码
ALTER SCHEMA test_schema RENAME TO new_test_schema;

执行后提示 ALTER SCHEMA,重命名后模式下的对象(表、视图)会自动归属到新模式名,无需修改表的归属。

2.6.2 2. 删除模式(DROP SCHEMA)

删除模式前需注意:模式下若有对象(表、视图),直接删除会报错 ,需加 CASCADE 选项级联删除模式及所有对象(高危操作,谨慎使用)。

步骤 1:确认模式下的对象

执行以下命令,查看模式下是否有对象:

sql 复制代码
\dt new_test_schema.*

若有对象,需确认是否要一并删除(无备份则无法恢复)。

步骤 2:执行删除命令
  • 无对象时删除

    sql 复制代码
    DROP SCHEMA IF EXISTS new_test_schema;
  • 有对象时级联删除(谨慎!会删除模式下所有表):

    sql 复制代码
    DROP SCHEMA IF EXISTS new_test_schema CASCADE;

执行后提示 DROP SCHEMA,表示删除成功,模式及相关对象会从数据库中永久移除。

2.7 模式常见问题排查

文档中提到了模式操作的典型报错,以下是两种高频问题及解决方案:

问题 1:找不到模式下的表,报错 "关系对象不存在"

报错信息

plaintext 复制代码
ERROR:  relation "user_info" does not exist

原因 :模式搜索路径未包含目标模式(如 test_schema 不在搜索路径中),数据库默认在 public 模式查找表。
解决方案:修改搜索路径包含目标模式:

sql 复制代码
SET search_path TO test_schema, public;
问题 2:无权限访问模式,报错 "模式权限被拒绝"

报错信息

plaintext 复制代码
ERROR:  permission denied for schema test_schema

原因 :当前用户无 test_schemaUSAGE 权限。
解决方案 :由模式所有者或管理员授予 USAGE 权限:

sql 复制代码
GRANT USAGE ON SCHEMA test_schema TO 当前用户名;

三、总结:表空间与模式的配合使用

通过本文的学习,我们掌握了表空间和模式的核心操作:

  • 表空间:管 "物理存储",负责数据文件的路径规划,优化 IO 性能;

  • 模式:管 "逻辑隔离",负责数据库对象的分类存放,避免冲突、精细化权限控制。

在实际应用时,二者常常一同被采用,创建起"订单业务表空间 ts_order"以及"订单业务模式 schema_order",把与订单有关的表安放于此,如此一来便改善了存储性能,而且使得业务对象的管理更为明晰。

下一篇文章将会依靠表空间和模式,去学习"表的创建与管理",表是数据库存储数据的关键载体,亦是后续执行数据操作的根基所在。

相关推荐
Rick199317 小时前
Redis查询为什么快
数据库·redis·缓存
fly spider17 小时前
MySQL索引篇
android·数据库·mysql
oradh17 小时前
Oracle数据库表存储基本概述
数据库·oracle·oracle基础·oracle入门·oracle表存储
为什么不问问神奇的海螺呢丶17 小时前
Oracle Golden Gate 19c 微服务版 (19.1.0.0.4) 静默安装
数据库·微服务·oracle
NineData17 小时前
使用NineData实现MySQL异地多活场景
运维·数据库·mysql
森叶17 小时前
逻辑仲裁者:实现多事件关联匹配与事务原子化后执行逻辑的技术方案
数据库·oracle
Navicat中国17 小时前
北京理工大学推荐 Navicat | 高校教育行业应用案例
数据库·navicat·高校·教育版
素玥18 小时前
实训7 json文件数据用python导入数据库
数据库·python·json
Rick199318 小时前
Redis 底层架构图
数据库·redis·缓存
ZC跨境爬虫18 小时前
海南大学交友平台开发实战 day9(头像上传存入 SQLite+BLOB 存储 + 前后端联调避坑全记录)
前端·数据库·python·sqlite