簡體   English   中英

從 JavaScript/TypeScript 中的字符串獲取特定數據(用於創建表的 SQL 腳本)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM