[英]Get particular data(SQL script for creating table) from string in JavaScript/TypeScript
我正在編寫從 PostgreSQL 到 Oracle 的遷移腳本。 我想檢索沒有任何其他數據的CREATE TABLE
腳本。
它應該如下所示:
CREATE TABLE public.actor (
actor_id integer DEFAULT nextval('public.actor_actor_id_seq'::regclass) NOT NULL,
first_name character varying(45) NOT NULL,
last_name character varying(45) NOT NULL,
last_update timestamp without time zone DEFAULT now() NOT NULL
);
但是當我使用以下方法獲取數據時:
let script = execSync('pg_dump -t \'actor\' --schema-only dvdrental', {encoding: 'utf-8'});
我收到如下所示的數據:
--
-- PostgreSQL database dump
--
-- Dumped from database version 13.1
-- Dumped by pg_dump version 13.1
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: actor; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.actor (
actor_id integer DEFAULT nextval('public.actor_actor_id_seq'::regclass) NOT NULL,
first_name character varying(45) NOT NULL,
last_name character varying(45) NOT NULL,
last_update timestamp without time zone DEFAULT now() NOT NULL
);
ALTER TABLE public.actor OWNER TO postgres;
--
-- Name: actor actor_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.actor
ADD CONSTRAINT actor_pkey PRIMARY KEY (actor_id);
--
-- Name: actor last_updated; Type: TRIGGER; Schema: public; Owner: postgres
--
CREATE TRIGGER last_updated BEFORE UPDATE ON public.actor FOR EACH ROW EXECUTE FUNCTION public.last_updated();
--
-- PostgreSQL database dump complete
--
你能建議我如何使用split
方法或一些regexp
來獲取特定的字符串。 或者也許是一些從數據庫獲取腳本的命令,用於CREATE TABLE
到);
范圍。
假設格式總是這樣(例如它總是 pgdump),您可以逐行迭代文本並提取CREATE TABLE
和結束括號之間的所有內容:
function *createTableStatements(sql) {
let buf;
for (let line of sql.split('\n')) {
if (line.trim().startsWith('CREATE TABLE'))
buf = [line]
else if (buf) {
buf.push(line);
if (line.startsWith(');')) {
yield buf.join('\n');
buf = null;
}
}
}
}
//
sql = ....
for (let stmt of createTableStatements(sql)) {
// do something with stmt
}
要解析任意格式的 SQL 您需要一個專門的解析器庫,不要嘗試使用字符串函數或正則表達式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.