I have a sql script called myscript.sql that looks like this:
-- Comment that I have in my sql script.
MERGE INTO my_table i using
(select several_columns
from my_other_table f
where condition
) f on (my join conditions)
WHEN MATCHED THEN
UPDATE SET whatever;
COMMIT;
I have tried to call it from python the same way I do from a SQL Developer worksheet, which is:
cursor().execute(r'''@"path_to_my_script\myscript.sql"''')
But it does not work, the following error is raised:
DatabaseError: ORA-00900: invalid SQL statement
How could I execute the script?
CodePudding user response:
In Oracle, it is invalid to pass multiple statements as a single command (this is to help prevent SQL injection attacks). Given that your script contains multiple statements then it is impossible to run it with a single command.
If your script only has SQL statements (and no PL/SQL statements) then:
- Read the script into a string.
- Split the string into statements on the SQL statement terminator
;
- Open a connection to the database.
- Turn auto-commit off.
- Run each statement individually.
- Finally, and optionally,
COMMIT
the transaction (in your case the script includesCOMMIT
as the final statement).
If you have PL/SQL statements then you will need to check whether each statement is SQL or PL/SQL and would be terminated by, respectively, ;
or /
(on a new line) and split the string accordingly.
(Note: It is also possible to terminate SQL statements with /
on a new-line. If you want to include PL/SQL statements in your script then it may be simplest to terminate all statements with /
on a new-line. This means that for SQL statements you should include only /
and not ;
as well. For PL/SQL statements, you should terminate the block with END;
and include the final ;
and then terminate the statement with /
on a new line.)
CodePudding user response:
You can read the contents of the SQL file and pass it to the execute()
method.
See this other question and its answers that look very much related: reading external sql script in python
CodePudding user response:
from sqlalchemy import create_engine
engine = create_engine('postgresql://username:password@host:port/database')
connection = engine.connect()
result = connection.execute("Your SQL QUERY")
connection.close()