首页 > 其他分享 >使用prisma studio链接任何server

使用prisma studio链接任何server

时间:2023-12-25 11:13:33浏览次数:55  
标签:prisma const server studio return payload op

使用prisma studio链接任何server

当我在serverless中使用prisma成功后

理所当然的我想让 prisma studio 连接到我位于 serverless 中的服务

当我在互联网搜索 prisma studio remote sqlite 时,我没有找到合适的方案

和我同样想法的问题: https://community.fly.io/t/expose-sqlite-db-to-external-orm-connections/8300

所以我决定自己实现一个,得益于 prisma studio 所使用的api接口之简易,比我想象中花的时间更少(可能一个小时?)

下面分享我的具体做法:

  1. 首先,在本地的开发项目中启动 prisma studio

image

  1. 通过一个小巧的 js 代码片段,将浏览器客户端请求转发到远程服务器

https://gist.github.com/2234839/b9b3fa6bd20a49b4da884357ce6f9523

// 请求拦截.js
(() => {
  const rqwFetch = globalThis.fetch;
  globalThis.fetch = async (...arg) => {
    const [url, init] = arg;
    const payload = JSON.parse(init.body);
    if (
      url.toString().endsWith("/api") &&
      payload.channel =<span style="font-weight: bold;" class="mark"> "prisma" &&
      payload.action </span>= "clientRequest"
    ) {
      return rqwFetch("https://shenzilong.cn/studio_server/api", init);
    } else {
      return rqwFetch(...arg);
    }
  };
})();
  1. 然后在后端实现对应的接口
app.post(api_path, async (c) => {
  const req = await c.req.json();
  const [payload, resHelper] = reqParser(req);

  const r = await execClientRequest(payload.data)
  return c.json(resHelper(r, null));
});
interface queries {
  schemaHash: string;
  modelName: "Proxy_api";
  operation: "count";
  args?: {
    take: 100;
    skip: 0;
    select: { id: true; Wallet_id: true; Wallet: true; createdAt: true; updatedAt: true };
  };
}
interface payload {
  data:
    | {
        schemaHash: string;
        operation: "$transaction";
        queries: queries[];
      }
    | queries;
}
async function execClientRequest(op: payload["data"]) {
  if (op.operation == "$transaction") {
    const { queries } = op;
    const actions = queries.map(execQueries);
    const r = await prisma.$transaction(actions);
    return r;
  } else if (["findMany", "count", "update"].includes(op.operation)) {
    return execQueries(op);
  }
  function execQueries(op: queries) {
    return prisma[toLowerCase(op.modelName) as /** 类型欺骗 */ "wallet"][op.operation](op.args);
  }
}
function toLowerCase(str: string): string {
  return str.toLowerCase();
}
function reqParser(req: any) {
  const { requestId, action, payload } = req;
  return [
    payload as payload,
    (data: any, error: any) => {
      return {
        requestId,
        channel: "-prisma",
        action,
        payload: { error, data },
      };
    },
  ] as const;
}

稍微测了一下增删改查,一点毛病没有,如果我使用过程中遇到其他问题我会更新 gist 中的代码片段

https://gist.github.com/2234839/b9b3fa6bd20a49b4da884357ce6f9523

image

by : https://shenzilong.cn/工具/prisma/使用prisma_studio链接任何server

标签:prisma,const,server,studio,return,payload,op
From: https://www.cnblogs.com/szpq/p/use-prisma-studio-to-link-any-server-z3bqno.html

相关文章

  • 解决SQL SERVER 2022数据库的表中修改字段的数据类型后不能保存
    SQLSERVER2008数据库的表中修改字段的数据类型后,不能保存:启动MSSQLSERVER2008,选择菜单工具-〉选项-〉左侧有个设计器-〉表设计器和数据库设计器。然后去掉“阻止保存要求重新创建表的更改”前面的勾。重新启动MSSQLSERVER2008即可http://kangry.net/blog/?type=article&......
  • 在serverless中使用prisma
    在serverless中使用prisma众所周知为了冷启动速度一般要将代码打包到一个js文件。当在项目中使用了prisma打包完后上传到serverless平台,一般会遇到第一个问题:Error:Invalid`prisma.companie.findMany()`invocation:Queryenginebinaryforcurrentplatform"......
  • SQL Server Management Studio (SSMS)教程:创建数据库create database、创建表create t
    USEmasterGOIFNOTEXISTS(SELECTnameFROMsys.databasesWHEREname=N'TutorialDB')CREATEDATABASE[TutorialDB]GOUSE[TutorialDB]--Createanewtablecalled'Customers'inschema'dbo'--Dropthetable......
  • Qt&&C++ 实现Tcp Server
    关于Qt&C++实现Tcp服务器的一些简易使用笔记... "材料"准备#include<QTcpServer>//Server需要包含该头文件,Client则不用#include<QTcpSocket>#include<QHostAddress>服务器流程简要1.实例化一个QTcpServer对象:  QTcpServer*server=newQTcpServer(this);2......
  • Linux 启动MySQL 报错:Status:“Server shutdown complete“ Error:13(权限不够)
    Status:“Servershutdowncomplete”Error:13(权限不够)我在银河麒麟V10系统中安装启动MySQL出现的一个错误:“Servershutdowncomplete”Error:13(权限不够),我在其他系统中没有遇到到。问题背景在国产化系统银河麒麟V10上尝试启动MySQL服务器时,可能会收到如下错误信息:Status:"Ser......
  • LabelStudio数据标注详细方法
    文章目录情感分析任务LabelStudio使用指南1.label-studio安装2.label-studio项目创建3.情感分析任务标注3.1语句级情感分类任务3.2属性级情感分析任务3.2.1属性-情感极性-观点词抽取(1)Span类型标签(2)Relation类型标签3.2.2属性-情感极性抽取3.2.3属性-观点词抽取3.2.4属......
  • SQLServer的varchar与nvarchar的学习之二
    SQLServer的varchar与nvarchar的学习之二背景昨天简单总结了多种数据库varchar和nvarchar的区别与关系今天想着能够分析一下数据库文件.计划使用winhex查看数据文件,简单进行学习过程创建数据库和表,然后进行一些测试,进行简单测试判断.createdatabasezhaobshc......
  • 关于Android studio新版本和NEW UI显示返回按钮的设置
    1.新版Androidstudio问题因为在新版本的AndroidStudio中,默认情况下是没有直接的选项来显示返回上一步按钮在状态栏上的,可以通过以下方法来实现返回上一步的功能:在AndroidStudio的顶部菜单栏中,选择"View"。在"View"菜单中,选择"Appearance"。在"Appearance"子菜单中,勾选"Toolbar"......
  • Eureka Server 自我保护机制
    https://blog.csdn.net/u012410733/article/details/112303048下面是官方提供的Eureka架构图: 1、什么是自我保护机制默认情况下,如果EurekaServer在一定时间内(默认90秒,其实不止90秒)没有接收到某个微服务实例的心跳,EurekaServer将会移除该实例。但是当网络分区故障发生......
  • 零门槛Serverless课堂 应用全托管 so easy!
    前言一切要从一个风和日丽的早上说起:那天,阳光正好,微风不燥。还来不及从容吃口早饭,我就接到了线上报警,赶忙打开了电脑,处理突发的流量高峰导致的页面报错。重启好服务,饭都冷了。我心里想着,如果能够简化操作就好了,如果是界面化的操作该多好,如果几分钟就能轻松搞定就好了,......上述情况......