第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將MySQL模式轉(zhuǎn)換為Github Wiki?

將MySQL模式轉(zhuǎn)換為Github Wiki?

慕容3067478 2020-02-02 15:48:45
我正在使用GitHub Wiki頁面記錄一個項(xiàng)目,現(xiàn)在我想將MySQL數(shù)據(jù)庫模式導(dǎo)出為markdown格式。有沒有辦法將CLI輸出轉(zhuǎn)換為GitHub Wiki md?理想情況下作為表格。
查看完整描述

2 回答

?
GCT1015

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個贊

此代碼很長。我道歉。它由兩個存儲過程組成。您可能會滿意只運(yùn)行第一個。第二個使用第一個的輸出(數(shù)據(jù)在表中第一個保留)。您可能還希望將代碼合并為一個。但是我將它們分開。第二個存儲的proc產(chǎn)生類似于的輸出describe myTable。但是它將對您需要此類輸出的數(shù)據(jù)庫中的所有表執(zhí)行此操作。


通過為數(shù)據(jù)庫傳遞要報(bào)告的參數(shù)(字符串)來使用它。


我創(chuàng)建了一個單獨(dú)的數(shù)據(jù)庫,并且代碼按名稱顯式引用了該數(shù)據(jù)庫中的表。因此,如果您EXECUTE對此存儲過程有特權(quán),則可以從任何當(dāng)前數(shù)據(jù)庫中運(yùn)行它。因此,作為一個簡單的測試,不要將報(bào)告數(shù)據(jù)庫設(shè)置為當(dāng)前數(shù)據(jù)庫,而只需按名稱(使用報(bào)告數(shù)據(jù)庫名稱限定)來調(diào)用存儲過程。這全部顯示在下面的測試塊中。


兩種存儲過程

CREATE SCHEMA Reporting101a;    -- See **Note1**


DROP PROCEDURE IF EXISTS `Reporting101a`.`describeTables_v2a`;

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `Reporting101a`.`describeTables_v2a`(

    IN dbName varchar(100), -- the dbname to report table structures

    OUT theSession int, -- OUT parameter for session# assigned

    IN deleteSessionRows BOOL, -- true for delete rows when done from main reporting table for this session#

    IN callTheSecondStoredProc BOOL -- TRUE = output is from Pretty output in Second Stored Proc. FALSE= not so pretty output

)

BEGIN

    DECLARE thisTable CHAR(100);


    DROP TEMPORARY TABLE IF EXISTS Reporting101a.tOutput;

    CREATE TEMPORARY TABLE Reporting101a.tOutput

    (   id int auto_increment primary key,

        tblName varchar(100) not null,

        ordVal int not null,

        cField varchar(100) not null,

        cType varchar(100) not null,

        cNull varchar(100) not null,

        cKey varchar(100) not null,

        cDefault varchar(100) null,

        cExtra varchar(100) null

    );

    DROP TEMPORARY TABLE IF EXISTS Reporting101a.tOutput2;

    CREATE TEMPORARY TABLE Reporting101a.tOutput2

    (   tblName varchar(100) primary key,

        colCount int not null,

        cFieldMaxLen int not null,

        cTypeMaxLen int not null,

        cNullMaxLen int not null,

        cKeyMaxLen int not null,

        cDefaultMaxLen int not null,

        cExtraMaxLen int not null

    );


    INSERT Reporting101a.tOutput(tblName,ordVal,cField,cType,cNull,cKey,cDefault,cExtra)

    SELECT TABLE_NAME,ORDINAL_POSITION,COLUMN_NAME AS Field, COLUMN_TYPE AS TYPE, RPAD(IS_NULLABLE,4,' ') AS 'Null', 

    RPAD(COLUMN_KEY,3,' ') AS 'Key',RPAD(COLUMN_DEFAULT,7,' ') AS 'DEFAULT',EXTRA AS Extra

    FROM information_schema.columns WHERE table_schema = dbName ORDER BY table_name,ordinal_position; 

    -- select * from information_schema.columns WHERE table_schema = '57security' order by table_name,ordinal_position; 


    UPDATE Reporting101a.tOutput

    SET cExtra='     '

    WHERE cExtra='';


    UPDATE Reporting101a.tOutput

    SET cField=RPAD(cField,5,' ')

    WHERE LENGTH(cField)<5;


    INSERT Reporting101a.tOutput2(tblName,colCount,cFieldMaxLen,cTypeMaxLen,cNullMaxLen,cKeyMaxLen,cDefaultMaxLen,cExtraMaxLen)

    SELECT tblName,COUNT(*),0,0,0,0,0,0 

    FROM Reporting101a.tOutput 

    GROUP BY tblName;


    UPDATE tOutput2 t2

    JOIN

    (   SELECT tblName,MAX(LENGTH(cField)) AS mField,MAX(LENGTH(cType)) AS mType,MAX(LENGTH(cNull)) AS mNull,

        IFNULL(MAX(LENGTH(cKey)),0) AS mKey,IFNULL(MAX(LENGTH(cDefault)),0) AS mDefault,IFNULL(MAX(LENGTH(cExtra)),0) AS mExtra

        FROM Reporting101a.tOutput

        GROUP BY tblName

    ) x

    ON x.tblName=t2.tblName

    SET t2.cFieldMaxLen=x.mField,t2.cTypeMaxLen=x.mType,cNullMaxLen=x.mNull,

    cKeyMaxLen=x.mKey,cDefaultMaxLen=x.mDefault,cExtraMaxLen=x.mExtra;


    -- DROP TABLE Reporting101a.reportDataDefsSession; -- useful for quick change of structure of table

    -- note, keep above drop call remmed out ! Just use it for quick tweaks to structure

    CREATE TABLE IF NOT EXISTS Reporting101a.reportDataDefsSession

    (   -- for the sole purpose of safe session auto_inc usage

        -- Please don't delete unless you want the sessions to experience aberant behavior

        sessionId INT AUTO_INCREMENT PRIMARY KEY,

        dummy CHAR(1) NOT NULL,

        creationDT datetime not null

    );


    CREATE TABLE IF NOT EXISTS Reporting101a.reportDataDefs

    (   sessionId INT NOT NULL,

        tblName VARCHAR(100) NOT NULL,  -- Tablename

        ordVal INT NOT NULL,    -- the "position number" of the Column

        cField VARCHAR(100) NOT NULL,   -- The Column

        cType VARCHAR(100) NOT NULL,    -- Datatype

        cNull VARCHAR(100) NOT NULL,    -- Nullability

        cKey VARCHAR(100) NOT NULL, -- Key info

        cDefault VARCHAR(100) NULL, -- Default value

        cExtra VARCHAR(100) NULL,   -- Extra output

        colCount INT NOT NULL,  -- the columns here and below are de-normalize data

        cFieldMaxLen INT NOT NULL,

        cTypeMaxLen INT NOT NULL,

        cNullMaxLen INT NOT NULL,

        cKeyMaxLen INT NOT NULL,

        cDefaultMaxLen INT NOT NULL,

        cExtraMaxLen INT NOT NULL

    );


    -- For lack of a better notion, we are calling calls "sessions". The programmer calls the

    -- First Stored Proc, and we call that a session after we get a unique next incrementing number.

    -- That number is the session #. House all output with that as a column value. This allows us to 

    -- move between stored procs, have safe output, have historical snapshots, and retain the data 

    -- via a session # for later use, whatever use.

    INSERT Reporting101a.reportDataDefsSession(dummy,creationDT) VALUES ('X',now());

    SET @mySession=LAST_INSERT_ID(); -- there it is, our session # (read the above paragraph)


    INSERT Reporting101a.reportDataDefs(sessionId,tblName,ordVal,cField,cType,cNull,cKey,cDefault,cExtra,

    colCount,cFieldMaxLen,cTypeMaxLen,cNullMaxLen,cKeyMaxLen,cDefaultMaxLen,cExtraMaxLen)    

    SELECT @mySession,t1.tblName,t1.ordVal,t1.cField,t1.cType,t1.cNull,t1.cKey,t1.cDefault,t1.cExtra,

    t2.colCount,t2.cFieldMaxLen,t2.cTypeMaxLen,t2.cNullMaxLen,t2.cKeyMaxLen,t2.cDefaultMaxLen,t2.cExtraMaxLen 

    FROM Reporting101a.tOutput t1

    JOIN Reporting101a.tOutput2 t2

    ON t2.tblName=t1.tblName

    ORDER BY t1.tblName,t1.id;


    DROP TEMPORARY TABLE Reporting101a.tOutput;

    DROP TEMPORARY TABLE Reporting101a.tOutput2;

    SET theSession=@mySession; -- the OUT var that came in as a parameter


    -- ***************************************************************************

    -- ***************************************************************************

    -- Label "Some_Sort_of_Output":

    IF callTheSecondStoredProc=TRUE THEN

        -- The caller says to call the second stored proc (for Pretty Printing)

        -- This will generate output similar to `DESCRIBE myTable`

        -- But remember, it will do it  for EVERY table in referenced database

        CALL Reporting101a.`Print_Tables_Like_Describe`(@mySession);

        -- The above call just gave you output.

    ELSE

        -- The caller chose to not auto call the Pretty Printing second stored procedure.

        -- Note, the caller can easily call it right after using the OUT parameter.

        -- So our output will be a resultset of out reportDataDefs table for this session #

        SELECT * 

        FROM Reporting101a.reportDataDefs 

        WHERE sessionId=@mySession

        ORDER BY tblName,ordVal;

    END IF;

    -- ***************************************************************************

    -- ***************************************************************************


    IF deleteSessionRows=TRUE THEN

        -- The caller says output rows are NOT needed at this point. Delete them.

        -- Note, if this boolean comes in TRUE, you can't call Pretty Printing

        -- second stored procedure with the session # because the data is gone.

        --

        -- Regardless, you are getting something back from "Some_Sort_of_Output" above.

        DELETE FROM Reporting101a.reportDataDefs

        WHERE sessionId=@mySession;

    END IF;

END$$

DELIMITER ;


DROP PROCEDURE IF EXISTS `Reporting101a`.`Print_Tables_Like_Describe`;

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `Reporting101a`.`Print_Tables_Like_Describe`(

    pSessionId INT

)

BEGIN

    DECLARE done INT DEFAULT FALSE;

    DECLARE curTable VARCHAR(100) DEFAULT '';

    DECLARE bFirst BOOL DEFAULT TRUE;


    DECLARE lv_tblName,lv_cField,lv_cType,lv_cNull,lv_cKey,lv_cDefault,lv_cExtra VARCHAR(100);

    DECLARE lv_ordVal,lv_colCount,lv_cFieldMaxLen,lv_cTypeMaxLen,lv_cNullMaxLen,lv_cKeyMaxLen,lv_cDefaultMaxLen,lv_cExtraMaxLen INT;


    DECLARE cur1 CURSOR FOR SELECT tblName,ordVal,cField,cType,cNull,cKey,cDefault,cExtra,

    colCount,cFieldMaxLen,cTypeMaxLen,cNullMaxLen,cKeyMaxLen,cDefaultMaxLen,cExtraMaxLen 

    FROM Reporting101a.reportDataDefs

    WHERE sessionId=pSessionId

    ORDER BY tblName,ordVal;


    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;


    -- Please note in the above, CURSOR stuff must come last else "Error 1337: Variable or condition decl aft curs" 


    CREATE TABLE IF NOT EXISTS Reporting101a.reportOutput

    (   lineNum INT AUTO_INCREMENT PRIMARY KEY,

        sessionId INT NOT NULL,

        lineOut varchar(100) NOT NULL

    );


    -- INSERT Reporting101a.reportOutput(sessionId,lineOut)

    -- SELECT 

    -- SET curTable='';

    DELETE FROM Reporting101a.reportOutput

    WHERE sessionId=pSessionId;


    OPEN cur1;


    read_loop: LOOP

        FETCH cur1 INTO lv_tblName,lv_ordVal,lv_cField,lv_cType,lv_cNull,lv_cKey,lv_cDefault,lv_cExtra,

            lv_colCount,lv_cFieldMaxLen,lv_cTypeMaxLen,lv_cNullMaxLen,lv_cKeyMaxLen,lv_cDefaultMaxLen,lv_cExtraMaxLen ;

        IF done THEN

            LEAVE read_loop;

        END IF;

        IF lv_tblName<>curTable THEN

            IF bFirst=FALSE THEN

                INSERT Reporting101a.reportOutput(sessionId,lineOut)

                SELECT pSessionId,'';

            ELSE

                SET bFirst=FALSE;

            END IF;

            INSERT Reporting101a.reportOutput(sessionId,lineOut)

            SELECT pSessionId,lv_tblName;

            INSERT Reporting101a.reportOutput(sessionId,lineOut)

            SELECT pSessionId,CONCAT('+-', 

                REPEAT('-',GREATEST(5,lv_cFieldMaxLen)),  '-+-',

                REPEAT('-',GREATEST(4,lv_cTypeMaxLen)), '-+-',

                REPEAT('-',GREATEST(4,lv_cNullMaxLen)), '-+-',

                REPEAT('-',GREATEST(3,lv_cKeyMaxLen)),  '-+-',

                REPEAT('-',GREATEST(7,lv_cDefaultMaxLen)),  '-+-',

                REPEAT('-',GREATEST(5,lv_cExtraMaxLen)),    '-+');


            SET @dashLineNumRow=LAST_INSERT_ID();


            INSERT Reporting101a.reportOutput(sessionId,lineOut)

            SELECT pSessionId,CONCAT('| ', 

                'Field',

                REPEAT(' ',GREATEST(0,lv_cFieldMaxLen-5)),  ' | ',

                'Type',

                REPEAT(' ',GREATEST(0,lv_cTypeMaxLen-4)),   ' | ',

                'Null',

                REPEAT(' ',GREATEST(0,lv_cNullMaxLen-4)),   ' | ',

                'Key',

                REPEAT(' ',GREATEST(0,lv_cKeyMaxLen-3)),    ' | ',

                'Default',

                REPEAT(' ',GREATEST(0,lv_cDefaultMaxLen-7)),    ' | ',

                'Extra',

                REPEAT(' ',GREATEST(0,lv_cExtraMaxLen-5)),  ' |');


            INSERT Reporting101a.reportOutput(sessionId,lineOut)

            SELECT pSessionId,lineOut

            FROM Reporting101a.reportOutput

            WHERE lineNum=@dashLineNumRow;


            -- SELECT * FROM Reporting101a.reportDataDefs WHERE sessionId=24;

            SET curTable=lv_tblName;

        END IF;

        INSERT Reporting101a.reportOutput(sessionId,lineOut)

        SELECT pSessionId,

            CONCAT('| ', 

            COALESCE(lv_cField,''),

            COALESCE(REPEAT(' ',GREATEST(0,lv_cFieldMaxLen-LENGTH(lv_cField))),''),' | ',

            COALESCE(lv_cType,''),

            COALESCE(REPEAT(' ',GREATEST(0,lv_cTypeMaxLen-LENGTH(lv_cType))),''),' | ',

            COALESCE(lv_cNull,''),

            COALESCE(REPEAT(' ',GREATEST(0,lv_cNullMaxLen-LENGTH(lv_cNull))),''),' | ',

            COALESCE(lv_cKey,'   '),

            COALESCE(REPEAT(' ',GREATEST(0,lv_cKeyMaxLen-LENGTH(lv_cKey))),''),' | ',

            COALESCE(lv_cDefault,'       '),

            COALESCE(REPEAT(' ',GREATEST(0,lv_cDefaultMaxLen-LENGTH(lv_cDefault))),''),' | ',

            COALESCE(lv_cExtra,'     '),

            COALESCE(REPEAT(' ',GREATEST(0,lv_cExtraMaxLen-LENGTH(lv_cExtra))),''),' |');

        INSERT Reporting101a.reportOutput(sessionId,lineOut)

        SELECT pSessionId,lineOut

        FROM Reporting101a.reportOutput

        WHERE lineNum=@dashLineNumRow;

    END LOOP;

    CLOSE cur1;


    select lineOut as '' from Reporting101a.reportOutput where sessionId=pSessionId order by lineNum;

END$$

DELIMITER ;

測試

測試:


-- See **Note2**

SET @theOutVar =-1; -- A variable used as the OUT variable below


-- See **Note3**

-- Note: with `TRUE` as the 4th parameter, this is a one call deal. Meaning, you are done.

call Reporting101a.describeTables_v2a('stackoverflow',@theOutVar,false,true);


-- See **Note4**

-- Primarily used if the 4th parameter above is false

call Reporting101a.Print_Tables_Like_Describe(@theOutVar); -- loads data for prettier results in chunk format.

輸出量

+--------------------------------------------------------------------------------------------+

|                                                                                    |

+--------------------------------------------------------------------------------------------+

| course                                                                                     |

| +------------+--------------+------+-----+---------+----------------+                      |

| | Field      | Type         | Null | Key | Default | Extra          |                      |

| +------------+--------------+------+-----+---------+----------------+                      |

| | courseId   | int(11)      | NO   | PRI |         | auto_increment |                      |

| +------------+--------------+------+-----+---------+----------------+                      |

| | deptId     | int(11)      | NO   | MUL |         |                |                      |

| +------------+--------------+------+-----+---------+----------------+                      |

| | courseName | varchar(100) | NO   |     |         |                |                      |

| +------------+--------------+------+-----+---------+----------------+                      |

|                                                                                            |

| dept                                                                                       |

| +----------+--------------+------+-----+---------+----------------+                        |

| | Field    | Type         | Null | Key | Default | Extra          |                        |

| +----------+--------------+------+-----+---------+----------------+                        |

| | deptId   | int(11)      | NO   | PRI |         | auto_increment |                        |

| +----------+--------------+------+-----+---------+----------------+                        |

| | deptName | varchar(100) | NO   |     |         |                |                        |

| +----------+--------------+------+-----+---------+----------------+                        |

|                                                                                            |

| scjunction                                                                                 |

| +------------+---------+------+-----+---------+----------------+                           |

| | Field      | Type    | Null | Key | Default | Extra          |                           |

| +------------+---------+------+-----+---------+----------------+                           |

| | id         | int(11) | NO   | PRI |         | auto_increment |                           |

| +------------+---------+------+-----+---------+----------------+                           |

| | studentId  | int(11) | NO   | MUL |         |                |                           |

| +------------+---------+------+-----+---------+----------------+                           |

| | courseId   | int(11) | NO   | MUL |         |                |                           |

| +------------+---------+------+-----+---------+----------------+                           |

| | term       | int(11) | NO   |     |         |                |                           |

| +------------+---------+------+-----+---------+----------------+                           |

| | attendance | int(11) | NO   |     |         |                |                           |

| +------------+---------+------+-----+---------+----------------+                           |

| | grade      | int(11) | NO   |     |         |                |                           |

| +------------+---------+------+-----+---------+----------------+                           |

|                                                                                            |

| student                                                                                    |

| +-----------+--------------+------+-----+---------+----------------+                       |

| | Field     | Type         | Null | Key | Default | Extra          |                       |

| +-----------+--------------+------+-----+---------+----------------+                       |

| | studentId | int(11)      | NO   | PRI |         | auto_increment |                       |

| +-----------+--------------+------+-----+---------+----------------+                       |

| | fullName  | varchar(100) | NO   |     |         |                |                       |

| +-----------+--------------+------+-----+---------+----------------+                       |

|                                                                                            |

| testtable                                                                                  |

| +-----------------------------------------+---------------+------+-----+---------+-------+ |

| | Field                                   | Type          | Null | Key | Default | Extra | |

| +-----------------------------------------+---------------+------+-----+---------+-------+ |

| | noPKhere                                | int(11)       | NO   |     |         |       | |

| +-----------------------------------------+---------------+------+-----+---------+-------+ |

| | veryLongColumnName_And_Then.Some_%_More | decimal(12,2) | YES  |     |         |       | |

| +-----------------------------------------+---------------+------+-----+---------+-------+ |

| | limit                                   | int(11)       | NO   |     |         |       | |

| +-----------------------------------------+---------------+------+-----+---------+-------+ |

|                                                                                            |

| testtable2                                                                                 |

| +-------+---------+------+-----+---------+-------+                                         |

| | Field | Type    | Null | Key | Default | Extra |                                         |

| +-------+---------+------+-----+---------+-------+                                         |

| | id    | int(11) | NO   | PRI |         |       |                                         |

| +-------+---------+------+-----+---------+-------+                                         |

+--------------------------------------------------------------------------------------------+

注意1:將Reporting101a創(chuàng)建一個名為的數(shù)據(jù)庫來容納兩個存儲過程和一些支持表。這些例程通過調(diào)用存儲過程來開始,該存儲過程引用要使用字符串報(bào)告的數(shù)據(jù)庫。


通過專用INFORMATION_SCHEMA數(shù)據(jù)庫以只讀安全方式訪問產(chǎn)生輸出的數(shù)據(jù)。因此,不會影響正在報(bào)告的數(shù)據(jù)庫。


此數(shù)據(jù)庫中保留了三個非臨時表。


reportDataDefsSession -用于獲取會話的簡單表格#

reportDataDefs-數(shù)據(jù)返回INFORMATION_SCHEMA并進(jìn)行了一些處理。它是基于會話的。

reportOutput-用于MySQL的打印打印的表DESCRIBE。它只是用于將輸出放在一起的表。它是基于會話的。

注2:該INT變量作為OUT參數(shù)目標(biāo)被包括在內(nèi),并寫入其中,并允許您在First存儲過程準(zhǔn)備好數(shù)據(jù)之后插入其他代碼。它代表一個會話#,該會話隔離輸出以供以后報(bào)告。


某些環(huán)境(例如PHP)具有某些技巧,這些技巧使某些程序員無法理解。因此,如果您需要自己組合兩個存儲過程,則可以這樣做(或者如果您感到困惑,請分別詢問我)。


無論如何,它顯示了數(shù)據(jù)或工作量如何將存儲過程調(diào)用鏈接在一起。


坦白地說,我使用會話#作為OUT參數(shù)的主要原因之一是,我知道我必須創(chuàng)建一個CURSOR才能獲得漂亮的輸出。而這需要Cursor DECLARE在第二個存儲過程的頂部。并且DECLAREs必須出現(xiàn)在存儲過程的頂部。所以雙手合十,我走了這條路。


注意3:這是對第一個存儲過程的調(diào)用。很有可能您將在此調(diào)用后以TRUE作為第四個參數(shù)來完成操作。存儲過程在其中非常有據(jù)可查。第三個參數(shù)用于確定是否要從會話號的報(bào)告表中刪除數(shù)據(jù)。刪除發(fā)生在任何輸出作為結(jié)果集之后。因此,這取決于您的選擇。


參數(shù):


描述所有表的數(shù)據(jù)庫名稱,例如 describe myTable

INT OUT用來保存會話的參數(shù)

布爾值:是否要在最后從報(bào)表中刪除數(shù)據(jù)

布爾值:我們是否應(yīng)該自動調(diào)用生成describe類似輸出的漂亮打印存儲過程。如果您決定將參數(shù)4傳遞為FALSE,那么您的輸出可能類似于以下內(nèi)容:


注意4:在需要不同輸出但希望使用會話編號的情況下使用。您通常不需要這個。


查看完整回答
反對 回復(fù) 2020-02-02
?
慕蓋茨4494581

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個贊

你只需要刪除表輸出的第一個和最后一個行和替代+的|,以有表降價格式。


像這樣:


|Field|Type|Null|Key|Default|Extra|

|-----|----|----|---|-------|-----|

|blockheight|int(11)|No|PRI|NULL||

...


查看完整回答
反對 回復(fù) 2020-02-02
  • 2 回答
  • 0 關(guān)注
  • 641 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號