2010-07-20 4 views
2

La sortie ci-dessous provient d'Oracle; où il génère des instructions "create table" en utilisant un paquet fourni. Je les nourris dans l'outil de comparaison de python HtmlDiff qui utilise difflib sous les couvertures. Chaque table est suivie d'un certain nombre de commandes "alter table add constraint" qui ajoutent les différentes contraintes. Le problème est qu'il n'y a pas de commande explicite des commandes "alter table", et je dois les réorganiser après avoir généré le fichier de sortie, avant d'exécuter la comparaison. J'ai besoin d'aide pour faire ça; idéalement en utilisant python, sed ou awk.Python: Comment trier les instructions SQL dans un fichier texte?

Les règles seraient Après chaque ligne contenant « CREATE TABLE » jusqu'à ce que la ligne suivante contenant « CREATE TABLE » trier chaque ligne contenant « AJOUTER CONTRAINTE »

Ceci est un exemple de ma sortie:

CREATE TABLE T1 
    ( BOOK_ID NUMBER NOT NULL ENABLE, 
     LOCATION_ID NUMBER NOT NULL ENABLE, 
      NAME VARCHAR2(255) NOT NULL ENABLE, 
    LEGAL_ENTITY VARCHAR2(255) NOT NULL ENABLE, 
      STATUS CHAR(1) NOT NULL ENABLE 
    ) ; 

ALTER TABLE T1 ADD CONSTRAINT T1_CHK_1 CHECK (status IN ('A', 'I' , 'T')) ENABLE; 
ALTER TABLE T1 ADD CONSTRAINT T1_PK PRIMARY KEY (BOOK_ID) ENABLE; 
ALTER TABLE T1 ADD CONSTRAINT T1_AK_1 UNIQUE (NAME) ENABLE; 
ALTER TABLE T1 ADD CONSTRAINT T1_FK_1 FOREIGN KEY (LOCATION_ID) REFERENCES T6 (LOCATION_ID) ENABLE; 

CREATE TABLE T2 
     ( 
        BUCKET_ID NUMBER NOT NULL ENABLE, 
     DATA_LOAD_SESSION_ID NUMBER, 
        IS_LOCKED CHAR(1) NOT NULL ENABLE, 
       LOCK_DATE_TIME DATE 
     ) ; 
ALTER TABLE T2 ADD CONSTRAINT CKC_IS_LOCKED_BUCKET CHECK (IS_LOCKED in ('T','F')) ENABLE; 
ALTER TABLE T2 ADD CONSTRAINT T2_PK PRIMARY KEY (BUCKET_ID) ENABLE; 
ALTER TABLE T2 ADD CONSTRAINT T2_FK_2 FOREIGN KEY (RRDB_STAGING_TABLE_ID) REFERENCES T4 (RRDB_STAGING_TABLE_ID) ENABLE; 

CREATE TABLE T3 
     (     VALUE_DATE DATE, 
           NODE_ID NUMBER, 
          RESULT_UID VARCHAR2(255), 
     LATEST_EOD_SING_VAL_RESULT_ID NUMBER NOT NULL ENABLE 
     ) 
ALTER TABLE T3 ADD CONSTRAINT T3_PK PRIMARY KEY (VALUE_DATE, NODE_ID, RESULT_UID) ENABLE; 

sortie souhaitée: la seule différence est l'ordre des lignes "ADD" CONTRAINTE

CREATE TABLE T1 
    ( BOOK_ID NUMBER NOT NULL ENABLE, 
     LOCATION_ID NUMBER NOT NULL ENABLE, 
      NAME VARCHAR2(255) NOT NULL ENABLE, 
    LEGAL_ENTITY VARCHAR2(255) NOT NULL ENABLE, 
      STATUS CHAR(1) NOT NULL ENABLE 
    ) ; 
ALTER TABLE T1 ADD CONSTRAINT T1_AK_1 UNIQUE (NAME) ENABLE; 
ALTER TABLE T1 ADD CONSTRAINT T1_CHK_1 CHECK (status IN ('A', 'I' , 'T')) ENABLE; 
ALTER TABLE T1 ADD CONSTRAINT T1_FK_1 FOREIGN KEY (LOCATION_ID) REFERENCES T6 (LOCATION_ID) ENABLE; 
ALTER TABLE T1 ADD CONSTRAINT T1_PK PRIMARY KEY (BOOK_ID) ENABLE; 

CREATE TABLE T2 
    ( 
       BUCKET_ID NUMBER NOT NULL ENABLE, 
    DATA_LOAD_SESSION_ID NUMBER, 
       IS_LOCKED CHAR(1) NOT NULL ENABLE, 
      LOCK_DATE_TIME DATE 
    ) ; 
ALTER TABLE T2 ADD CONSTRAINT CKC_IS_LOCKED_BUCKET CHECK (IS_LOCKED in ('T','F')) ENABLE; 
ALTER TABLE T2 ADD CONSTRAINT T2_FK_2 FOREIGN KEY (RRDB_STAGING_TABLE_ID) REFERENCES T4 (RRDB_STAGING_TABLE_ID) ENABLE; 
ALTER TABLE T2 ADD CONSTRAINT T2_PK PRIMARY KEY (BUCKET_ID) ENABLE; 

CREATE TABLE T3 
    (     VALUE_DATE DATE, 
          NODE_ID NUMBER, 
         RESULT_UID VARCHAR2(255), 
    LATEST_EOD_SING_VAL_RESULT_ID NUMBER NOT NULL ENABLE 
    ) 
ALTER TABLE T3 ADD CONSTRAINT T3_PK PRIMARY KEY (VALUE_DATE, NODE_ID, RESULT_UID) ENABLE; 
+0

pour sélectionner la meilleure réponse? –

Répondre

0

Chargez le tout dans une chaîne, puis scindez ";" pour construire un tableau de commandes SQL. Boucle le tableau et construit un nouveau tableau trié. Passez les bits CREATE TABLE et découpez les instructions ALTER TABLE dans une liste distincte. triez() la liste alter et étendez-la au tableau des résultats. Lorsque vous avez terminé, ';\n'.join(result_array) + ';'.

0

rapide et sale, mais je pense que cela va le faire pour votre cas (a travaillé sur l'exemple pour sûr):

conList = [] 
for ln in f: 
    if ' ADD CONSTRAINT ' in ln: 
     conList.append(ln) 
    else: 
     for it in sorted(conList): 
      print it 
     conList = [] 
     print ln 
# finish any unfinished business 
for it in sorted(conList): 
    print it 
soins
Questions connexes