sql >> Database teknologi >  >> RDS >> Oracle

Parse SQL-fil med PL/SQL og DML/DDL ved hjælp af cx_Oracle i python

Det er muligt at udføre flere sætninger på samme tid, men det er semi-hacky. Du skal pakke dine udsagn ind og udføre dem én ad gangen.

>>> import cx_Oracle
>>>
>>> a = cx_Oracle.connect('schema/[email protected]')
>>> curs = a.cursor()
>>> SQL = (("""create table tmp_test ( a date )"""),
... ("""insert into tmp_test values ( sysdate )""")
... )
>>> for i in SQL:
...     print i
...
create table tmp_test ( a date )
insert into tmp_test values ( sysdate )
>>> for i in SQL:
...     curs.execute(i)
...
>>> a.commit()
>>>

Som du har bemærket, løser dette ikke semikolon-problemet, som der ikke er noget let svar på. Som jeg ser det har du 3 muligheder:

  1. Skriv en overkompliceret parser, som jeg slet ikke synes er en god mulighed.

  2. Udfør ikke SQL-scripts fra Python; have koden i enten separate SQL-scripts, så parsingen er nem, i en separat Python-fil, indlejret i din Python-kode, i en procedure i databasen... osv. Dette er nok min foretrukne mulighed.

  3. Brug subprocess og kalder manuskriptet på den måde. Dette er den enkleste og hurtigste mulighed, men bruger ikke cx_Oracle overhovedet.

    >>> import subprocess
    >>> cmdline = ['sqlplus','schema/[email protected]','@','tmp_test.sql']
    >>> subprocess.call(cmdline)
    
    SQL*Plus: Release 9.2.0.1.0 - Production on Fri Apr 13 09:40:41 2012
    
    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
    
    
    Connected to:
    Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
    
    SQL>
    SQL> CREATE TABLE FOO(id number);
    
    Table created.
    
    SQL>
    SQL> BEGIN
      2    INSERT INTO FOO VALUES(1);
      3    INSERT INTO FOO VALUES(2);
      4    INSERT INTO FOO VALUES(3);
      5  END;
      6  /
    
    PL/SQL procedure successfully completed.
    
    SQL> CREATE TABLE BAR(id number);
    
    Table created.
    
    SQL>
    SQL> quit
    Disconnected from Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
    0
    >>>
    



  1. auxService:mapreduce_shuffle eksisterer ikke

  2. I Postgresql, fremtving unik på kombination af to kolonner

  3. Android Studio 3.0 canary 1:SQL-syntaksfejl

  4. Er vi klar til Nordic PGDay?