есть SQL-скрипт такого типа.
Код: Выделить всё
USE SCHEMA "CCM";
-- create table and insert a single row
DECLARE
l_QUERY VARCHAR(8000);
BEGIN
-- Create table if not exists
l_QUERY := 'CREATE TABLE IF NOT EXISTS test_declare_table
(
STUDENTID NUMBER(38,0) NOT NULL,
FIRSTNAME VARCHAR(16777216) NOT NULL,
LASTNAME VARCHAR(16777216) NOT NULL,
AGE NUMBER(38,0) NOT NULL
)';
EXECUTE IMMEDIATE l_QUERY;
-- Insert a single row with fixed values
l_QUERY := 'INSERT INTO test_declare_table (STUDENTID, FIRSTNAME, LASTNAME, AGE) VALUES (1, ''John'', ''Doe'', 30)';
EXECUTE IMMEDIATE l_QUERY;
END;
Код: Выделить всё
def decode_sql_script(self, script_path):
encodings_to_try = ['utf-8','utf-8-sig','utf-16le','utf-16be','utf-16','utf-16-sig','utf-32le','utf-32be','iso-8859-1','cp1252','ascii', 'latin-1']
with open(script_path, 'rb') as sql_file:
sql_content = sql_file.read().strip()
for encoding in encodings_to_try:
print(encoding)
try:
decoded_sql = sql_content.decode(encoding)
print(f"Prepared Script to be executed : {decoded_sql}") # if not error script decode ok
return decoded_sql
#cursors = conn.execute_string(decoded_sql)
except Exception as e:
self.sql_errors.append(f"{encoding} error: {e}")
continue
for conn in self.connections:
conn.rollback()
conn.close()
print("Transaction rolled back due to script error.")
#sys.exit(1)
raise ValueError("Failed to decode SQL file with supported encodings.")
Код: Выделить всё
def deploy_scripts(self):
# Define query tag based on the environment
if self.env == "prd":
query_tag = "Change Request: " + self.change_request_num
else:
query_tag = "Deployment Request: " + self.deployment_request_id
status = [] # List to store deployment status
# Connect to Snowflake
conn = self.connect_to_snowflake(self.script_details)
self.connections.append(conn)
try:
# Iterate over each script
for script in self.script_details['scripts']:
script_path = os.path.join(self.repo_root_dir, "SnowflakeCICDFramework", "Stage", self.deployment_request_id, self.env.upper(), self.repo_base_path, self.read_database_name, script) # read from stage
print(f"Executing Script: {script}")
try:
with conn.cursor() as cursor:
cursor.execute(f"ALTER SESSION SET QUERY_TAG = '{query_tag}'")
decoded_sql = self.decode_sql_script(script_path)
cursors = conn.execute_string(decoded_sql)
# Iterate over each query in the script
for cursor in cursors:
query_id = cursor.sfqid
print(f"\tExecuting Query ID: {query_id}")
while True:
query_status = conn.get_query_status(query_id)
if conn.is_still_running(query_status):
print(f"Query {query_id} is still running...")
time.sleep(5) # Sleep for 5 seconds before checking again
continue
тогда весь DECLARE... "END;" блок для запуска как 1
потому что я получаю следующую ошибку:
[img]https://i .sstatic.net/ArUQO.png[/img]
это происходит потому, что мой скрипт пытается отправить снежинку для запуска:
Код: Выделить всё
DECLARE
l_QUERY VARCHAR(8000);
Есть идеи? Я попытался использовать и отправить весь блок pl/sql, но получаю «дайте 2 для запуска, ожидаемо 1».
Я пытался сделать возможность отправить весь скрипт в виде строки для запуска. понравилось все содержимое файла, но не сработало.
Подробнее здесь: https://stackoverflow.com/questions/782 ... ies-to-run