diff --git a/snowflake_utils/__main__.py b/snowflake_utils/__main__.py index 19a5c4b..b6835c1 100644 --- a/snowflake_utils/__main__.py +++ b/snowflake_utils/__main__.py @@ -1,7 +1,9 @@ import typer from typing_extensions import Annotated -from .models import FileFormat, InlineFileFormat, Table +from .models import FileFormat, InlineFileFormat, Table, Schema, Column +from .queries import connect +import logging app = typer.Typer() @@ -27,5 +29,32 @@ def copy( ) +@app.command() +def mass_single_column_update( + schema: Annotated[str, typer.Argument()], + target_column: Annotated[str, typer.Argument()], + new_column: Annotated[str, typer.Argument()], + data_type: Annotated[str, typer.Argument()], +) -> None: + db_schema = Schema(name=schema) + target_column = Column(name=target_column, data_type=data_type) + new_column = Column(name=new_column, data_type=data_type) + logging.getLogger().setLevel("DEBUG") + with connect() as conn, conn.cursor() as cursor: + tables = db_schema.get_tables(cursor=cursor) + for table in tables: + columns = table.get_columns(cursor=cursor) + column_names = [str.upper(column.name) for column in columns] + if ( + str.upper(target_column.name) in column_names + and str.upper(new_column.name) in column_names + ): + table.single_column_update( + cursor=cursor, target_column=target_column, new_column=new_column + ) + else: + logging.debug("One or both of the columns don't exist in the table") + + if __name__ == "__main__": app() diff --git a/snowflake_utils/models.py b/snowflake_utils/models.py index ef6a594..4459e84 100644 --- a/snowflake_utils/models.py +++ b/snowflake_utils/models.py @@ -64,6 +64,28 @@ class Column(BaseModel): data_type: str +class Schema(BaseModel): + name: str + database: str | None = None + + @property + def fully_qualified_name(self): + if self.database: + return f"{self.database}.{self.name}" + else: + return self.name + + def get_tables(self, cursor: SnowflakeCursor): + cursor.execute(f"show tables in schema {self.fully_qualified_name};") + data = cursor.execute( + 'select "name", "database_name", "schema_name" FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));' + ).fetchall() + return [ + Table(name=name, schema_=schema, database=database) + for (name, database, schema, *_) in data + ] + + class Table(BaseModel): name: str schema_: str @@ -300,6 +322,17 @@ def drop(self, cursor: SnowflakeCursor) -> None: logging.debug(f"Dropping table:{self.schema_}.{self.name}") cursor.execute(f"drop table {self.schema_}.{self.name}") + def single_column_update( + self, cursor: SnowflakeCursor, target_column: Column, new_column: Column + ): + """Updates the value of one column with the value of another column in the same table.""" + logging.debug( + f"Swapping the value of {target_column.name} with {new_column.name} in the table {self.name}" + ) + cursor.execute( + f"UPDATE {self.schema_}.{self.name} SET {target_column.name} = {new_column.name};" + ) + def _possibly_cast(s: str, old_column_type: str, new_column_type: str) -> str: if old_column_type == "VARIANT" and new_column_type != "VARIANT": diff --git a/tests/cassettes/test_schema_tables.yaml b/tests/cassettes/test_schema_tables.yaml new file mode 100644 index 0000000..04a0d7e --- /dev/null +++ b/tests/cassettes/test_schema_tables.yaml @@ -0,0 +1,379 @@ +interactions: +- request: + body: !!binary | + H4sIANdxIWYC/21SXW/CIBT9K02ftmQlRauLe2MUldgCAtb41HR+Z7YmpotZTP/7AI3rPl4I95xz + uefey8VfFXXhv3gXHyeUMJ0jIXIaG8QXn/XuWOFjVa2X9fHkP3ltTUakopxZYRc8A2hplbFckoze + iOrjcDAowpjPTBZDKbHyeTrBGRWB1p1uD3ZsYsJHlN0FJKELhuKUslZNwjIqOUvN3dk1HhKKkb55 + +McsV5aIi9N5X13jtumyWHIVwAhEAAbFqexH9gz60du+tmqx0GPOfrYJQzBocdJ0Ra+W8bV+i8Q8 + FTQh0rGHotp6sAdCEHoPSxsFsBeaCEQhgI/OHVYiT3nsnhsimuRcEDcALRGmbGTwbniflS3MZ/p7 + yozoOZeTv4TieEL0L7yxRpFSJsXtujzvQLEpB9vNO5ii185utXYLJcp2nwskzW60mUX7qwhJhkTj + ca7HkqDYclHTNF8iivkcVAIAAA== + headers: + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '361' + Content-Type: + - application/json + User-Agent: + - PythonConnector/3.7.1 (macOS-14.4.1-arm64-arm-64bit) CPython/3.10.9 + accept: + - application/snowflake + method: POST + uri: https://00000000-0000-0000-0000-000000000000.snowflakecomputing.com/session/v1/login-request?request_id=00000000-0000-0000-0000-000000000000&databaseName=00000000-0000-0000-0000-000000000000&warehouse=00000000-0000-0000-0000-000000000000&roleName=00000000-0000-0000-0000-000000000000&request_guid=00000000-0000-0000-0000-000000000000 + response: + body: + string: !!binary | + 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 + headers: + Cache-Control: + - no-cache, no-store, no-transform + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '1536' + Content-Type: + - application/json + Date: + - Thu, 18 Apr 2024 19:17:44 GMT + Expect-CT: + - enforce, max-age=3600 + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding, User-Agent + X-Content-Type-Options: + - nosniff + X-Country: + - Brazil + X-Frame-Options: + - deny + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: !!binary | + H4sIANhxIWYC/zWOywqDMBREfyVkXQpB0T5WVbsQSi2YQrcxvWLAxOqNVBH/vbeFLufMHJiFY99K + mDw/MI5N92ZeVS0gM46hbsAqVp6uWVI8trd7csnTI98wrnB2+jyBJqtWLQIxhH4EpyF/EhQEKA5z + OVbWIJrOSWPh28QiCKN4F4ViH9DqpQZlwcOAVC7r30s75+lVJosfXj/9nIHRqAAAAA== + headers: + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '163' + Content-Type: + - application/json + User-Agent: + - PythonConnector/3.7.1 (macOS-14.4.1-arm64-arm-64bit) CPython/3.10.9 + accept: + - application/snowflake + method: POST + uri: https://00000000-0000-0000-0000-000000000000.snowflakecomputing.com/queries/v1/query-request?requestId=00000000-0000-0000-0000-000000000000&request_guid=00000000-0000-0000-0000-000000000000 + response: + body: + string: !!binary | + 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 + E82md89/Ax83ooc0GwAA + headers: + Cache-Control: + - no-cache, no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '1554' + Content-Type: + - application/json + Date: + - Thu, 18 Apr 2024 19:17:44 GMT + Expect-CT: + - enforce, max-age=3600 + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding, User-Agent + X-Content-Type-Options: + - nosniff + X-Country: + - Brazil + X-Frame-Options: + - deny + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: !!binary | + H4sIANhxIWYC/0WPQW/CMAyF/0qVUytxKDQUup066CSkbmhtOExjqkLwtEhNCkmQqKr+9zmDaTf7 + 8/N79kDsuWVwdeQhIBZaEC7YE80V7MkEqyN3/MAtNP/Iim9Q/A6C52r7ErD8qSzCqqh3JWvqVf4a + lnnNmrddUb03m3UYRdEj7hJuey2KKwhM++KthYkPPV9AC9gcEc4QYGv6+nJQ0lrZaSYV4GS6mCY0 + XSxTOo/nqDpxgwc4MBaHw/i3t+q0w2/WbOsxAe2MBC/5GIj0CTEqHVpax9XJ+2ZpliR0FscZjZfU + OxvZGen6u1jcHH9Txs9x/AFrP8H5MgEAAA== + headers: + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '253' + Content-Type: + - application/json + User-Agent: + - PythonConnector/3.7.1 (macOS-14.4.1-arm64-arm-64bit) CPython/3.10.9 + accept: + - application/snowflake + method: POST + uri: https://00000000-0000-0000-0000-000000000000.snowflakecomputing.com/queries/v1/query-request?requestId=00000000-0000-0000-0000-000000000000&request_guid=00000000-0000-0000-0000-000000000000 + response: + body: + string: !!binary | + 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 + 1KIsFAAA + headers: + Cache-Control: + - no-cache, no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '1887' + Content-Type: + - application/json + Date: + - Thu, 18 Apr 2024 19:17:45 GMT + Expect-CT: + - enforce, max-age=3600 + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding, User-Agent + X-Content-Type-Options: + - nosniff + X-Country: + - Brazil + X-Frame-Options: + - deny + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: !!binary | + H4sIANlxIWYC/9VWTW/jNhD9K4EvuWwWVvyRptdeC7TAHotCGFEjiWuKZIaUbTnIf+9wSCnZw24v + BdoeEpHicD7eezPy68a4Pmx+vvvjdTNiCNAjb143LekzUh1nn/ab3+c4OPuLsxZVdLT5dLdY8F/Q + ziaj3eenz1U6Cm4i9b17i0tlNNpY69E7itjWHtSJo4dkcwYzidHr/UTG6Ob+0919B5OJA9jWIKX9 + EKNPz5fJedJpFd0Jrb5hWivnZ8I+Lb8GZ9MzRNJW3gD1HiiIYQsRlIEQMKTtCeeLo7bYTyrKCo3k + LxbeBX3NIWzEayzp9WiRtPIQh7S9ad9pU1Jp5TlNEk+Ll+b2KM44dZtjWHfpDJwwO4vJtVi04t6b + qe/npbISXk1EmK9HAoUNYyjX1RJXSTAn/wNhzZdCBBvlhUKKuhPovl4+FCr+cFwLuBB4ealo9tH1 + vB3mXJFuV+DlhdUpasJU7MdyPJqTzh7AoG1BCAxCfEIRNGMXMjMEc/HEEISSS8gJ27jAu6JVT1Eb + OTS3UYJCvuQNxM7R+M68JxTBBN1bMNl0tko7WVrrIiQhJoFmvKbGk1PcFUJo4ZmP2VfN7KBNyg9L + hTpHAone6FCAJIFQe2hbKq5648RV1vZOzhNwttN9lkjXlWgvE07iwDBECtQgG+cXTeEI2ryTO/pC + WWdHiEqgQsvGnHKmXBqypslGPYrlMMKqFif4sGr0mAHK3VlyMS6xJ9jOLWtIqzqwThfXfo43yWQO + 5fFekbbBFzxUOIumEE6EXVqO3IpDjtdoC0FpgVJHlqdzmdwGAh73UhkLPS64Z+7iQAht6e0BwlAS + XiTQ6iwuliUuZZceDk6dMEt/MCiv8KrQpwg9ucmXyooSWUFUnIdgMrrTmIsowhySIPOtnIMOC4Cd + stHk4puG3CXkQaaGNItibTlVMDy/aB0zi9wXwHPmUSq4joa8vGkmbZiG3OoeCXhUpfVvHu2XL7/m + xFlJpYuIZ6iTpLvJqhXiLGzxl0cONOK9daz0c4m4SG0dnxBslcdC2s0wmm8EolzW/xDzwYDgX4S5 + 1kq35rFfAvO3aFmuPKEizHkze9c8RdYW7XnM5glxjWlKCRN8czVAIiuZMU1NmTF+xgSsEAFkV/0y + 1oWoMtnPkC8oZ9JYXETHMXNf3L9t3tIXjQNy348+fbGqp2q3Pz79dNxXz7t0/C99V1NSMu0nfnbc + ALHm8cNf0GTLWqC51m2y31bNTlV4eNhW290D7NvqYbvdPj5U3eFxu62eD1Dhx2/y4fkHNR+2+/9j + zQ18W/MRnuBjzcfH79d8qP47NfPPmH+q5O3fVfzn219tF3GaPAoAAA== + headers: + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '1009' + Content-Type: + - application/json + User-Agent: + - PythonConnector/3.7.1 (macOS-14.4.1-arm64-arm-64bit) CPython/3.10.9 + accept: + - application/json + method: POST + uri: https://00000000-0000-0000-0000-000000000000.snowflakecomputing.com/telemetry/send?request_guid=00000000-0000-0000-0000-000000000000 + response: + body: + string: "{\n \"data\" : \"Log Received\",\n \"code\" : null,\n \"message\" + : null,\n \"success\" : true\n}" + headers: + Connection: + - keep-alive + Content-Length: + - '86' + Content-Type: + - application/json + Date: + - Thu, 18 Apr 2024 19:17:45 GMT + Expect-CT: + - enforce, max-age=3600 + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding, User-Agent + X-Content-Type-Options: + - nosniff + X-Country: + - Brazil + X-Frame-Options: + - deny + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: !!binary | + H4sIANlxIWYC/6uuBQBDv6ajAgAAAA== + headers: + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '22' + Content-Type: + - application/json + User-Agent: + - PythonConnector/3.7.1 (macOS-14.4.1-arm64-arm-64bit) CPython/3.10.9 + accept: + - application/json + method: POST + uri: https://00000000-0000-0000-0000-000000000000.snowflakecomputing.com/session?delete=true&request_guid=00000000-0000-0000-0000-000000000000 + response: + body: + string: "{\n \"data\" : null,\n \"code\" : null,\n \"message\" : null,\n + \ \"success\" : true\n}" + headers: + Connection: + - keep-alive + Content-Length: + - '76' + Content-Type: + - application/json + Date: + - Thu, 18 Apr 2024 19:17:45 GMT + Expect-CT: + - enforce, max-age=3600 + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding, User-Agent + X-Content-Type-Options: + - nosniff + X-Country: + - Brazil + X-Frame-Options: + - deny + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/test_single_column_update.yaml b/tests/cassettes/test_single_column_update.yaml new file mode 100644 index 0000000..0a666b8 --- /dev/null +++ b/tests/cassettes/test_single_column_update.yaml @@ -0,0 +1,283 @@ +interactions: +- request: + body: !!binary | + H4sIANRxIWYC/21SXW/CIBT9K02ftmQlRauLe2MUldgCAtb41HR+Z7YmpotZTP/7AI3rPl4I95xz + uefey8VfFXXhv3gXHyeUMJ0jIXIaG8QXn/XuWOFjVa2X9fHkP3ltTUakopxZYRc8A2hplbFckoze + iOrjcDAowpjPTBZDKbHyeTrBGRWB1p1uD3ZsYsJHlN0FJKELhuKUslZNwjIqOUvN3dk1HhKKkb55 + +McsV5aIi9N5X13jtumyWHIVwAhEAAbFqexH9gz60du+tmqx0GPOfrYJQzBocdJ0Ra+W8bV+i8Q8 + FTQh0rGHotp6sAdCEHoPSxsFsBeaCEQhgI/OHVYiT3nsnhsimuRcEDcALRGmbGTwbniflS3MZ/p7 + yozoOZeTv4TieEL0L7yxRpFSJsXtujzvQLEpB9vNO5ii185utXYLJcp2nwskzW60mUX7qwhJhkTj + ca7HkqDYclHTNF8iivkcVAIAAA== + headers: + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '361' + Content-Type: + - application/json + User-Agent: + - PythonConnector/3.7.1 (macOS-14.4.1-arm64-arm-64bit) CPython/3.10.9 + accept: + - application/snowflake + method: POST + uri: https://00000000-0000-0000-0000-000000000000.snowflakecomputing.com/session/v1/login-request?request_id=00000000-0000-0000-0000-000000000000&databaseName=00000000-0000-0000-0000-000000000000&warehouse=00000000-0000-0000-0000-000000000000&roleName=00000000-0000-0000-0000-000000000000&request_guid=00000000-0000-0000-0000-000000000000 + response: + body: + string: !!binary | + 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 + headers: + Cache-Control: + - no-cache, no-store, no-transform + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '1530' + Content-Type: + - application/json + Date: + - Thu, 18 Apr 2024 19:17:41 GMT + Expect-CT: + - enforce, max-age=3600 + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding, User-Agent + X-Content-Type-Options: + - nosniff + X-Country: + - Brazil + X-Frame-Options: + - deny + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: !!binary | + H4sIANZxIWYC/zWOQQuCQBCF/8qw5wit0Cg6lO5BCBIcD51iswkEXdNZQRH/e2PQbd733hvepLit + kAanDqDyND6jhjS/XJNond5RZwiZRrCmJjhBZdg9lvuoVqAMj7bQAxVSfZuKSRhT25MtKHkJ9AWI + 7Masf9Ylc9lYLGtanNDf7oJwH2w8b0l9TCdfHXUs5jT/e1FjnUyL8fbD8xeKzlhNrQAAAA== + headers: + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '166' + Content-Type: + - application/json + User-Agent: + - PythonConnector/3.7.1 (macOS-14.4.1-arm64-arm-64bit) CPython/3.10.9 + accept: + - application/snowflake + method: POST + uri: https://00000000-0000-0000-0000-000000000000.snowflakecomputing.com/queries/v1/query-request?requestId=00000000-0000-0000-0000-000000000000&request_guid=00000000-0000-0000-0000-000000000000 + response: + body: + string: !!binary | + H4sIAAAAAAAEA81XW3OiShB+319BzbOeAjUm+jbCGKhwWxiTaGpriui4YQvFwyW7qVT+++nhImgk + +3p8sGQu3V93f/3Rvn+TJLQJsgBJU+kdHuDxECTBjmc8ScXi0zvawyOaImpYxKfYcpmzoO6Csrnj + WZiiHnoNolycWMKnb1l9TZN0fTCaWsbU9/+Zz4cSXel0ZaGP3tGaahrEpsz1yJxQVWdU9wjW/Mba + qHVYuO702ri6YN8j/sKkTNUX9h3zjRVpHChj+cxFGR1ddbq64MAnvm84NrsjxGXYNO5bHrZBlPKW + jypmi1CsYYrZwiesvi8WZtj/4vb3BfGWTHVsSh4hIqzqcPskoqvPvqBUzJmzGbY1RolJwDcYITae + mURrcnGOtDzAICG34GQIZTLuMdw3IItQdkDOCPYpU7pNVMFWBeius9IC3VDM/qIKnTS7UJ5jrj0C + +QPEIueQQ5uoVJRNpY9/DUF3bAi5igdwiQScIG0sZEl+seCWA1k3DctotYtyNRy3Yq/tH7uMLl3C + LOy6hn3beGi1oUlX7YjdJQWkzLedBxd7dyW7vpvAEcs1jblBvMbKGU4RzcqxW+RDC6q2jR+t1nkU + VwS5DPBIIKHt1r0Zj+R2b1XIqrQX9CHMxraDPc956ETVwSDfdGhLJwYXcthN9LPAKxeCFPcKKzsM + u8bfIGmGLxoIglcNDWSsBeeyg1qGHHNhAemgz+GuT2zfoF8qxsywMTCnS3B18tgukurft4j5SZ5P + jpbyW/W56dwCnrkjGp6CRghhxh6G5iFeK7Zzlagpe0x3JWYmaOJnjTnLDAhet6Y3LX4BNPAIUldL + oAHC5twRu6lZB0zIh0pAyRwKvc8+XzvDVwVXSiAQFS8ZVEODZizeVb7umC0BHV8NbtqUr29/ejsw + nWCPzgiG92fRS7a6bKAPxyeNgxfUUR3rRDY6YFaOVPOkjc9T0cgWiEcnrdCH9KNXDgNJ/Dt7O/DT + SWCf7555IsVbCbZTKT/ABME3EIWYJJ6DVMwC8JSuX/guKH/DelQtP79l3OT7n9kLmu7zKOqhwsMU + bcM/hZXoZDNdB+Km3EOHhK/DNIz3aKpMekjcLa0WUfbQOoaFrNgXey1daADv8igL+7/icM83/2/0 + 7RKkPCsq8ISuJzcDSK2Mfhz3szgLIrGt1DXjWZ5AfO21f3OevBnFEpKV5+Fa4Vd9WZGH/WB0ve3L + sjzoK9urgSwrk8m1wlFlq66om8Sv4YYnwmZRtJIe23AfRFpVdVvMibCPfJg2Zg68WFuH/IIM9ZFz + Ew9Bwl/iPOX1AQS0hxmTsAf9xIwXR80ZrKrOwoZhyjKg/UtnZamd7Szcb4oBVq420izIioVyzIVB + F456wF9jn/JE8BegV4ebTY1HMApf3ltUvId7oiyln/Kqtou0/BCFa2iMEkWB7qPCEiRJ8CYQ+vnh + ENfOSxqXYQi0fMf3GYXuK+umgMLUwbzCdC6IDq7rqqd8v/F4CvymYVkH5VoZjsbXN+PBaDKpPBc8 + KI/N42QXFLxCv1Kw1T6hxvuM/yk2j+kCMElYRvNU/Vco/i+Ep9mBBGQAAALYHQp8k/FkOBwpNzDv + 3MjHLMGxQxLGSZi9FYkvwpYkUJ4yU/BdZAu6elOwqqYMAttp8PN0Lc3Xa1gWloQ+fvv4Dy9FonvZ + DAAA + headers: + Cache-Control: + - no-cache, no-store + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '1257' + Content-Type: + - application/json + Date: + - Thu, 18 Apr 2024 19:17:42 GMT + Expect-CT: + - enforce, max-age=3600 + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding, User-Agent + X-Content-Type-Options: + - nosniff + X-Country: + - Brazil + X-Frame-Options: + - deny + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: !!binary | + H4sIANZxIWYC/8VVTW/kNgz9K8FcctksZjKZpNtrrwu0wB6LwqBl2taOLCmUnIwnyH8vRcrO7mF7 + 7WHGkkXx471H+m3nwpB2v9/8/babMCUYkDdvu47sC1KTl1j2u7+WPAb/R/AeTQ60+3SzWvAv2eCL + 0fHz0+dDOUphJvOre6tL4yz63NgpBsrYNRHMmaOnYvMCbhajt9uZnLPt7aeb2x5ml0fwnUMq+zHn + WJ7Pc4hkyyqHM3p7xbI2IS6EQ1l+T8GXZ8pkvbwBGiJQEsMOMhgHKWEq2zMur4G6aj+bLCt0kr9Y + xJDsRUP4jJdc0xvQI1kTIY9le7Wxt66m0slzniWeFS/t9V6ccepeY/jw2js4ozrLxbVYdOI+unkY + lrWyGt7MRKjXM4HBljGU62aNayRYkP9E2PCllMFneWGQsu0Fuu+vPxQq/nDaCngliPLS0BJzGHg7 + LlqR7Tbg5YW3JWrBVOynejy5s1UP4NB3IAQmIb6gCJaxS8oMwVI9MQSp5pI0YZ9XeDe0mjlbJ4fu + OklQ0EvRQe4DTR/MR0IRTLKDB6emizc2yNL7kKEIsQhU8ZrbSMFwVwihlWc+Zl8Ns4O+KD+tFVqN + BBK9takCSQKhjdB1VF0NLogr1fZRzgtwvreDSqTva7TnGWdx4BgiA2aUTYirpnAC6z7InWKlrPcT + ZCNQoWdjTlkpl4ZsaPbZTmI5TrCpJQg+rBo7KUDanTUXFwp7gu3SsYasaRLrdHUdl3yVTJZUHx8V + WZ9ixcOkF9EUwpmwL8uJW3HUeK31kIwVKG1meYag5LaQ8PFBKmOh5xV35S6PhNDV3h4hjTXhVQKd + VXGxLHEtu/ZwCuaMKv3RobzCi8FYIgwU5lgrq0pkBVF1npJTdOdJi6jCHIsg9ZbmYNMKYG98dlp8 + 21J4TTrIzFhmUW48pwqO5xdtY2aV+wq4Zp6lgsvkKMqbdraOadBWj0jAo6qs/4zov337qomzkmoX + Ec/QIEn3szcbxCps8acjB1rx3gVW+kuNuEptG5+Q/EHHQtktMLmfBGKC6n/MejAixGdhrvPSrTr2 + a2D+Fq3LjSc0hJo3s3fRKbK16MBjVifEJZcpJUzwzc0AibxkxjS1dcbEBQuwQgSQ3/TLWFei6mR/ + Ab1ggitjcRUdx9S+uH3fvZcvGgfkvp9i+WIdng7Hh8en3x7v9/t9Of6fvqslKZn2Mz97boDc8Pjh + L2ixZS3Q0tiu2O8P7dEc8HS3P+yPd/Dw1N9x5vd3h/7EJRy+fHk64I/f5NPDf9R8Oh137/+8/wsp + zObuVggAAA== + headers: + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '976' + Content-Type: + - application/json + User-Agent: + - PythonConnector/3.7.1 (macOS-14.4.1-arm64-arm-64bit) CPython/3.10.9 + accept: + - application/json + method: POST + uri: https://00000000-0000-0000-0000-000000000000.snowflakecomputing.com/telemetry/send?request_guid=00000000-0000-0000-0000-000000000000 + response: + body: + string: "{\n \"data\" : \"Log Received\",\n \"code\" : null,\n \"message\" + : null,\n \"success\" : true\n}" + headers: + Connection: + - keep-alive + Content-Length: + - '86' + Content-Type: + - application/json + Date: + - Thu, 18 Apr 2024 19:17:42 GMT + Expect-CT: + - enforce, max-age=3600 + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding, User-Agent + X-Content-Type-Options: + - nosniff + X-Country: + - Brazil + X-Frame-Options: + - deny + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: OK +- request: + body: !!binary | + H4sIANZxIWYC/6uuBQBDv6ajAgAAAA== + headers: + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Length: + - '22' + Content-Type: + - application/json + User-Agent: + - PythonConnector/3.7.1 (macOS-14.4.1-arm64-arm-64bit) CPython/3.10.9 + accept: + - application/json + method: POST + uri: https://00000000-0000-0000-0000-000000000000.snowflakecomputing.com/session?delete=true&request_guid=00000000-0000-0000-0000-000000000000 + response: + body: + string: "{\n \"data\" : null,\n \"code\" : null,\n \"message\" : null,\n + \ \"success\" : true\n}" + headers: + Connection: + - keep-alive + Content-Length: + - '76' + Content-Type: + - application/json + Date: + - Thu, 18 Apr 2024 19:17:43 GMT + Expect-CT: + - enforce, max-age=3600 + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding, User-Agent + X-Content-Type-Options: + - nosniff + X-Country: + - Brazil + X-Frame-Options: + - deny + X-XSS-Protection: + - 1; mode=block + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_models.py b/tests/test_models.py index 94942bc..7fb2edf 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -2,15 +2,23 @@ import pytest import os -from snowflake_utils.models import InlineFileFormat, Table, TableStructure +from snowflake_utils.models import ( + InlineFileFormat, + Table, + TableStructure, + Schema, + Column, +) from snowflake_utils.queries import connect -test_table_schema = TableStructure(columns={"id": "integer", "name": "text"}) +test_table_schema = TableStructure( + columns={"id": "integer", "name": "text", "last_name": "text"} +) path = os.getenv("S3_TEST_PATH", "s3://example-bucket/example/path") test_table = Table(name="PYTEST", schema_="PUBLIC", table_structure=test_table_schema) json_file_format = InlineFileFormat(definition="TYPE = JSON STRIP_OUTER_ARRAY = TRUE") storage_integration = "DATA_STAGING" - +test_schema = Schema(name="PUBLIC", database="SANDBOX") logger = logging.getLogger(__name__) @@ -134,3 +142,20 @@ def test_merge() -> None: storage_integration=storage_integration, primary_keys=["id"], ) + + +@pytest.mark.snowflake_vcr +def test_single_column_update() -> None: + with connect() as conn, conn.cursor() as cursor: + target_column = Column(name="name", data_type="text") + new_column = Column(name="last_name", data_type="text") + test_table.single_column_update( + cursor=cursor, target_column=target_column, new_column=new_column + ) + + +@pytest.mark.snowflake_vcr +def test_schema_tables() -> None: + with connect() as conn: + cursor = conn.cursor() + test_schema.get_tables(cursor=cursor)