数据库后端前端协作【免费下载链接】mathesarAn intuitive spreadsheet-like interface that lets users of all technical skill levels view, edit, query, and collaborate on Postgres data directly. 100% open source and self hosted, with native Postgres access control.项目地址https://gitcode.com/gh_mirrors/ma/mathesar点击查看免费下载Mathesar 0.5.0 是围绕面向外部用户的数据收集展开的一个里程碑版本它引入了可构建、可分享的表单Forms让任何人都能通过唯一链接直接向数据库提交数据而无需获得 Mathesar 安装实例的访问权限。同时该版本将默认的单记录查看方式从独立页面改为模态框Modal让列描述在表头直接可见并在安装流程中自动生成并持久化SECRET_KEY。读完本文你将全面了解 0.5.0 的功能脉络、表单从 RPC 接口到 PostgreSQL 底层 SQL 的完整调用链、各改进对应的源码实现位置以及从旧版本升级到 0.5.0 的两种标准操作流程。版本概览0.5.0 带来了什么根据官方发布说明Mathesar 0.5.0 的核心变化集中在四个方面表单构建器Form builder可以构建并分享表单从任何人那里收集信息无需授予其 Mathesar 安装的访问权限。表单与某张表绑定提交内容自动保存为新记录表单通过唯一链接分享任何拿到链接的人都能提交。单记录视图改为模态框表格页中的单记录链接默认在模态框中打开模态框内仍提供进入完整单记录页面的链接方便用户在不丢失表格上下文的情况下查看和编辑记录。列描述更醒目当列带有描述时表格页的表头会显示图标悬停即可看到描述不再需要打开 Inspector。安装时自动生成SECRET_KEY安装过程自动生成并持久化SECRET_KEY同时支持用户自行提供以覆盖自动生成的值。此外0.5.0 还包含两处 Bug 修复表格页结果尺寸切换时的 UI 卡顿、OIDC_CONFIG_DICT缺少默认值以及若干维护性改动。下面按主题逐项展开并结合当前仓库源码mathesar/、db/、mathesar_ui/验证其实现细节。表单构建器让外部用户直接向数据库提交数据表单是 0.5.0 的最大亮点。在 0.5.0 之前要向 Mathesar 数据库写入数据用户必须先成为安装实例的协作者并登录。0.5.0 之后你可以为任意一张表创建一份表单通过唯一链接分享出去任何拿到链接的人——包括完全没有 Mathesar 账号的人——都可以填写并提交数据会作为新记录写入数据库。表单并不仅仅是单表的字段列表它还可以串联多张表的数据你可以选择包含哪些字段、决定关联数据如何处理表单填写者可以按你的配置从已有记录中选择关联记录或现场创建新的关联记录。表单数据模型Form 与 FormField表单功能在后端由两个 Django 模型承载由迁移文件 mathesar/migrations/0007_form_formfield.py 创建Formmathesar_form表核心字段包括tokenUUID 类型、全局唯一即表单分享链接中携带的令牌、name、description、version、schema_oid、base_table_oid表单所基于的表、publish_public是否公开可访问、默认为False、submit_message、submit_redirect_url、submit_button_label、header_title/header_subtitleJSON 字段以及外键database、server、associated_role提交表单时使用的配置角色。FormFieldmathesar_formfield表表单的字段定义核心字段包括key表单内唯一的字符串标识、index显示顺序、label、help、kind只能是scalar_column或foreign_key两种取值、column_attnum对应的列号、related_table_oid外键字段指向的关联表、fk_interaction_rule、styling、is_required并通过parent_field自关联支持父子字段即关联表下的嵌套字段。其中fk_interaction_rule定义了填写者与关联记录的交互方式共有三种取值与前端 mathesar_ui/src/api/rpc/forms.ts 中fkFieldInteractionRules常量一一对应取值含义must_pick必须从关联表已有的记录中选择一项can_pick_or_create既可以选择已有记录也可以创建新记录must_create必须在关联表中创建一条新记录迁移文件还通过CheckConstraintform_field_kind_integrity约束了数据一致性scalar_column类型的字段不得设置fk_interaction_rule与related_table_oidforeign_key类型的字段则必须同时设置这两者。RPC 接口表单生命周期的完整调用链表单的管理与提交全部通过 RPC 方法暴露实现在 mathesar/rpc/forms.py前端类型定义在 mathesar_ui/src/api/rpc/forms.ts。完整方法清单如下RPC 方法认证要求用途forms.add登录新建表单forms.get匿名按form_token获取表单信息公开表单可匿名读取forms.get_source_info匿名获取表单涉及的源表与列信息forms.list登录列出某数据库某 schema 下的表单forms.patch登录更新表单字段整体替换forms.delete登录删除表单forms.regenerate_token登录重新生成表单的分享令牌forms.set_publish_public登录设置/取消表单的公开分享状态forms.list_related_records匿名通过行查找器Row Seeker列出可选的关联记录forms.submit匿名提交表单将数据写入数据库注意forms.get、forms.get_source_info、forms.list_related_records、forms.submit均以authanonymous暴露这是任何人只要拿到链接即可提交这一产品特性的技术根基。但匿名访问并非无条件submit在写入前会断言form_model.publish_public为真否则抛出This form does not accept submissions见 mathesar/utils/forms.py 中submit_form的实现get与get_source_info则通过has_permission_for_form做权限校验——表单publish_public为真时放行否则仅允许该数据库的已认证协作者访问。RPC 层还定义了与前端交换的数据结构FieldInfo、FormInfo含from_model类方法将 Django 模型转换为 RPC 响应、AddFormDef、AddOrReplaceFieldDef、SettableFormDef。其中FormInfo会通过form_model.fields.filter(parent_field__isnullTrue)只取顶层字段嵌套的child_fields由FieldInfo.from_model递归组装。表单提交的底层原理一次调用生成链式 INSERT表单提交最终落库的路径是forms.submitRPC→submit_formmathesar/utils/forms.py→form_insertdb/forms.py→ PostgreSQL 函数msar.form_insertdb/sql/05_msar.sql。submit_form会先把前端提交的values中形如{type: pick}的条目解析为已选记录fields_to_pick并据此对字段树做深度优先遍历与剪枝当某个外键字段的交互方式是选择而非创建时就不再向下遍历其子字段见iterate_form_fields中关于pick 时剪枝的注释与图示从而只向数据库发送真正需要插入的字段。db/forms.py中的form_insert(field_info_list, values, conn)将两个 JSON 结构序列化后调用数据库函数msar.form_insert。该函数的输入约定为field_info_list [ {key: k1, parent_key: None, column_attnum: 5, table_oid: 1234, depth: 0}, {key: k3, parent_key: k1, column_attnum: 3, table_oid: 4321, depth: 1}, ] values { k1: {type: create}, k2: Jane, k3: Doe, }msar.form_insert首先调用辅助函数msar.build_insert_lookup_table生成插入查找表每行包含目标表、列名、取值、CTE 名称与来源 CTE然后按depth倒序逐层拼接 SQL。当一次提交涉及多张表时生成的是一条带多个 CTE 的链式 INSERT 语句例如文档中的示例——向 Items 表插入时同时创建图书、作者并选择出版商WITH k1_cte AS ( INSERT INTO Library Management.Authors(First Name, Last Name) SELECT Jerome K., Jerome RETURNING * ), k0_cte AS ( INSERT INTO Library Management.Books(Title, Author, Publisher) SELECT Three men in a Boat, k1_cte.id, 12 FROM k1_cte RETURNING * ) INSERT INTO Library Management.Items(Acquisition Date, Acquisition Price, Book) SELECT 2025-10-09, 69.69, k0_cte.id FROM k0_cte RETURNING *这里{type: create}的值会展开为引用其自身 CTE 主键的表达式k1_cte.id从而实现先插入关联记录、再把新主键作为外键写入主表的跨表原子写入若外键列存在引用多列的复合外键约束multi_fks_cte会抛出Inserting into a column with foreign key constraints referencing multiple columns is currently unsupported.。另外msar.get_tab_col_info_mapdb/sql/05_msar.sql 中的同名函数负责按{table_oid: [attnum...]}结构批量取回表单字段对应表与列的结构信息供forms.get_source_info渲染表单使用。前端与测试佐证前端在 mathesar_ui/src/api/rpc/forms.ts 中定义了完整的forms方法类型容器以及RawScalarDataFormField/RawForeignKeyDataFormField两种字段类型constructRequestToAddForm会把前端使用的name/description组装为后端存储的header_title/header_subtitle。RPC 测试位于 mathesar/tests/rpc/test_forms.py覆盖了forms.add含foreign_key字段 can_pick_or_create交互规则 嵌套child_fields的完整请求/响应结构与forms.get。SQL 层面的msar.form_insert在 db/sql/test_sql_functions.sql 中有test_form_insert_fk、test_form_insert_scalar等测试函数分别验证外键创建与标量列插入两条路径。相关的工作项包括 PR #4598表单后端新增获取表单字段表/列信息的 RPC、#4609表单前端、#4637表单内实现行查找器、#4657实现forms.submit、#4680在get/get_source_info/submit前校验表单权限、#4694拖拽排序表单字段、#4726表单分析埋点等。单记录视图模态框不丢失表格上下文地查看记录0.5.0 之前点击表格页的单记录链接会跳转到独立页面0.5.0 改为在模态框中打开模态框内仍提供进入完整单记录页面的链接。这样用户可以在保持表格上下文的情况下快速审阅和编辑记录减少来回切换。前端实现位于 mathesar_ui/src/systems/record-view-modal/入口组件WithModalRecordView.svelte通过全局 modal storemathesar/stores/modal的modal.spawnModalControllerRecordStore()派生一个模态框控制器并把控制器注入 contextModalRecordView.svelte负责实际渲染弹窗内容ModalRecordViewContent.svelte承载记录详情。相关 PR 包括 #4674模态框记录视图与 #4659改进模态框焦点行为。列描述更醒目表头悬停即见此前查看列描述必须打开表右侧的 Inspector 面板0.5.0 之后只要某列配置了描述表头单元格就会显示描述图标鼠标悬停即可看到完整描述。该行为的实现位于 mathesar_ui/src/systems/table-view/header/header-cell/HeaderCell.svelte脚本中通过$: description ... description in col ? col.description : undefined从列信息中提取描述当description存在时表头的indicator-icons区域渲染一个TooltipiconDescription图标Tooltip的content槽即描述文本与排序、过滤、分组图标并列显示。对应的 PR 为 #4685在列头单元格中显示列描述。安装时自动生成并持久化 SECRET_KEY0.5.0 之前SECRET_KEY需要安装者手动生成并配置是安装流程中一个完全手动的步骤0.5.0 起该步骤被自动化。SECRET_KEY用于 Django 签名会话与加密相关数据在配置中同时也被用作SALT_KEY见 config/settings/common_settings.py其泄露或丢失会影响会话安全与数据一致性。自动生成逻辑位于 config/settings/common_settings.py 第 205218 行SECRETS_ROOT os.path.join(BASE_DIR, .secrets) SECRET_KEY os.environ.get(SECRET_KEY) # 我们不希望持久化环境变量形式的 SECRET_KEY if not SECRET_KEY: os.makedirs(SECRETS_ROOT, exist_okTrue) SECRET_KEY_FILE os.path.join(SECRETS_ROOT, secret_key.txt) try: with open(SECRET_KEY_FILE, x) as f: f.write(get_random_secret_key()) except FileExistsError: pass # 已存在则复用旧密钥 with open(SECRET_KEY_FILE, r) as f: SECRET_KEY f.read()其行为可以概括为三点优先读取环境变量如果部署环境已设置SECRET_KEY则直接采用用户提供的值会覆盖自动生成的密钥未设置时自动生成调用 Django 的get_random_secret_key()生成随机密钥并写入BASE_DIR/.secrets/secret_key.txt持久化与复用使用open(..., x)独占创建避免并发写入冲突若文件已存在如升级或重启场景则直接读取既有密钥保证重启后密钥稳定不变。需要特别注意的是该自动生成机制依赖持久化文件系统。因此在没有持久化文件系统的平台上例如 DigitalOcean 的 App Platform部署说明仍然要求手动提供SECRET_KEY环境变量——参见 docs/docs/administration/install-digitalocean.md 中的 Step 2: Generate a secret key先通过密钥生成工具生成密钥并复制再在 DigitalOcean 控制台的 Environment Variables 中新增SECRET_KEY以确保应用在每次重启后密钥一致。对应 PR 为 #4597默认生成并持久化SECRET_KEY。菜单语义澄清编辑与重命名分开针对表、schema、表单等对象0.5.0 区分了编辑edit与重命名rename两种操作并在菜单中改用更准确的措辞让用户在执行操作前更清楚地知道该动作的用途。这是 #4709将部分 UI 术语从 edit 改为 rename的成果属于纯前端 UX 改进。Bug 修复与维护改动0.5.0 还修复了两个问题表格页结果尺寸切换时的 UI 卡顿PR #4686修复了调整表格页每页显示条数result size时界面挂起hang的问题改善了交互流畅度。为OIDC_CONFIG_DICT增加默认值PR #4667避免在未显式配置 OIDC 相关字典时因缺少默认值导致配置错误保障单点登录配置的健壮性。维护方面包括编写 0.5.0 发布说明PR #4716、将 docs 环境的 setuptools 升级到 78.1.1PR #4484、删除 0.4.0 发布说明中的重复行PR #4662 / #4668。升级到 0.5.0升级路径因安装方式而异官方文档为两种部署形态分别提供了标准步骤。Docker Compose 安装的升级如果你使用 Docker Compose 部署只需拉取新镜像并重建容器docker compose -f /etc/mathesar/docker-compose.yml up --pull always -d如果你的安装目录不是/etc/mathesar/请将命令中的路径替换为你实际的安装目录。直接安装Linux / macOS / WSL的升级对于非 Docker 的独立安装0.3.0 之前称之为 Installation from scratchMathesar 提供了同时覆盖全新安装与升级的安装脚本。升级步骤如下进入你的 Mathesar 安装目录不要带末尾斜杠也不要用$HOME之类的变量cd /path/to/your/mathesar/installation从 Mathesar 0.5.0 的 Releases 页面下载对应版本的安装脚本赋予执行权限并运行# 将 下载地址 替换为 0.5.0 Release 页面中 install.sh 的实际地址 curl -sSfL 下载地址 -o install.sh chmod x install.sh ./install.sh .用 Mathesar 的 systemd 服务替换原有的 gunicorn systemd 服务# 先停用并停止旧的 gunicorn 服务 systemctl disable gunicorn.service systemctl stop gunicorn.service然后按照 docs/docs/administration/install-from-scratch.md 中Run Mathesar as a systemd service一节该节会创建运行mathesar run的 systemd unit适用于持续运行 24×7 的服务器完成新服务的配置最后删除旧的 gunicorn 服务文件sudo rm /lib/systemd/system/gunicorn.service更新 Caddyfile参照 docs/docs/administration/install-from-scratch.md 中Install and configure Caddy一节给出的配置更新你的 Caddyfile确保域名直接写在 Caddyfile 第一行然后重启 Caddysystemctl restart caddy.service提示如果你只在 localhost 上运行 Mathesar、不希望它作为系统服务常驻可以移除 gunicorn 与 caddy 两个服务改为手动启动mathesar run小结Mathesar 0.5.0 的实质是打开数据写入的对外通道表单功能让数据库从内部协作工具延伸为外部数据采集终端其背后是从 Django 模型、RPC 接口、权限校验到msar.form_insert链式 INSERT 的完整技术栈支撑单记录模态框与列描述表头化则围绕减少上下文切换优化了日常浏览体验而SECRET_KEY的自动化让自托管部署变得更简单可靠。如果你正在使用 0.5.0 之前的版本可按照上文两种升级路径平滑迁移若想深入了解表单机制建议从 mathesar/rpc/forms.py、mathesar/utils/forms.py 与 db/sql/05_msar.sql 三处源码入手并结合 mathesar/tests/rpc/test_forms.py 与 db/sql/test_sql_functions.sql 中的测试用例验证行为。赞分享数据库后端前端协作【免费下载链接】mathesarAn intuitive spreadsheet-like interface that lets users of all technical skill levels view, edit, query, and collaborate on Postgres data directly. 100% open source and self hosted, with native Postgres access control.项目地址https://gitcode.com/gh_mirrors/ma/mathesar点击查看免费下载相关推荐Mathesar 0.1.6 版本深度解析日语本地化、记录页长文本体验与部署链路的全面升级Mathesar 0.1.6 版本深度解析日语本地化、记录页长文本体验与部署链路的全面升级 Mathesar 0.1.6 是开源 Postgres 电子表格界数据库后端前端协作OpenSquilla 0.5.0 版本详解Model Ensemble 路由、升级安全、桌面签名更新与用量成本报表OpenSquilla 0.5.0 版本详解Model Ensemble 路由、升级安全、桌面签名更新与用量成本报表 OpenSquilla 0.5.0 是人工智能大模型AI Agent交互助手工具调用MCP 服务Agent 记忆RAG本地部署code2prompt版本查询查看与验证安装版本的命令详解code2prompt版本查询查看与验证安装版本的命令详解 在使用code2prompt工具时快速准确地确认当前安装版本是排查兼容性问题、获取新功能支持的基开发工具AI 应用上一篇QQ空间导出助手把说说、日志、相册一键备份到本地给青春上一把数字保险锁下一篇新手如何三步上手 openpilot开源驾驶辅助系统的保姆级入门指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考