courses/understanding_spanner/colab-notebooks/Spanner_PostgeSQL.ipynb (543 lines of code) (raw):

{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "QKBCLNZVAv_j" }, "source": [ "## Install the Spanner Python API\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "7uhDuh2B3-CX" }, "outputs": [], "source": [ "! pip install --upgrade google-cloud-spanner" ] }, { "cell_type": "markdown", "metadata": { "id": "f-wsCeqBAyWl" }, "source": [ "## Set the following variables \n", "\n", "You at least need to change the Project ID variable to your project's ID. You can change the other variables if you like. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "lJIrqAZz4CzU" }, "outputs": [], "source": [ "project_id = 'your-project-id-here'\n", "instance_id = 'spanner-postgres'\n", "\n", "processing_units = 100\n", "database_id = 'pets-postgres'\n", "\n", "OPERATION_TIMEOUT_SECONDS = 240\n", "\n", "!gcloud services enable spanner.googleapis.com \n", "print(\"Spanner Enabled\")\n", "\n", "print(\"Done\")" ] }, { "cell_type": "markdown", "metadata": { "id": "iziApd7nA5F1" }, "source": [ "## Create a Spanner instance" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "fUJGt4or4DgG" }, "outputs": [], "source": [ "import time\n", "from google.cloud import spanner\n", "\n", "def create_instance_with_processing_units(instance_id, processing_units):\n", " \"\"\"Creates an instance.\"\"\"\n", " spanner_client = spanner.Client(project=project_id)\n", "\n", " config_name = \"{}/instanceConfigs/regional-us-central1\".format(\n", " spanner_client.project_name\n", " )\n", "\n", " instance = spanner_client.instance(\n", " instance_id,\n", " configuration_name=config_name,\n", " display_name=instance_id,\n", " processing_units=processing_units,\n", " )\n", "\n", " # create() returns a long-running operation\n", " operation = instance.create()\n", "\n", " print(\"Waiting for operation to complete...\")\n", " operation.result(OPERATION_TIMEOUT_SECONDS)\n", "\n", " print(\n", " \"Created instance {} with {} processing units\".format(\n", " instance_id, instance.processing_units\n", " )\n", " )\n", "\n", "# Call the function\n", "create_instance_with_processing_units(instance_id, processing_units)" ] }, { "cell_type": "markdown", "metadata": { "id": "Ghw0o_qxBFIe" }, "source": [ "## Create the Pets database\n", "\n", "Note: The parameter database_dialect-2 makes this a PostgreSQL database. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "hpgkaDz24Osx" }, "outputs": [], "source": [ "def create_database(instance_id, database_id):\n", " \"\"\"Creates a database and tables for sample data.\"\"\"\n", " spanner_client = spanner.Client(project=project_id)\n", " instance = spanner_client.instance(instance_id)\n", "\n", " database = instance.database(\n", " database_id, database_dialect=2\n", " )\n", "\n", " # create() returns a long-running operation\n", " operation = database.create()\n", "\n", " print(\"Waiting for operation to complete...\")\n", " operation.result(OPERATION_TIMEOUT_SECONDS)\n", "\n", " print(\"Created database {} on instance {}\".format(database_id, instance_id))\n", "\n", "# Call the function\n", "create_database(instance_id, database_id)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "VRPYRaVaBHwp" }, "source": [ "## The following function runs DDL statements to build the database schema\n", "\n", "The parameter to the update_ddl() function is an array. You can run one or more DDL commands. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "6JY0xghs6SaR" }, "outputs": [], "source": [ "def run_ddl_statement(instance_id, database_id, ddl):\n", " \n", " spanner_client = spanner.Client(project=project_id)\n", " instance = spanner_client.instance(instance_id)\n", " database = instance.database(database_id)\n", "\n", " operation = database.update_ddl(\n", " [ddl]\n", " )\n", "\n", " print(\"Waiting for operation to complete...\")\n", " operation.result(OPERATION_TIMEOUT_SECONDS)\n", "\n", " print(\"Ran statement: {}\".format(ddl))\n" ] }, { "cell_type": "markdown", "metadata": { "id": "IDA3A4VYBSYp" }, "source": [ "## Create the Owners table" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "FIf7iqy16_2r" }, "outputs": [], "source": [ "ddl = \"\"\"CREATE TABLE Owners (\n", " OwnerID VARCHAR(36) PRIMARY KEY,\n", " OwnerName VARCHAR(1024) NOT NULL\n", " )\"\"\"\n", "\n", "run_ddl_statement(instance_id, database_id, ddl)" ] }, { "cell_type": "markdown", "metadata": { "id": "5jWaHTkBBW2z" }, "source": [ "## Create the Pets table\n", "\n", "Note: the Pets table is interleaved with the Owners table. This means each pet is stored with its owner. The primary key of the Pets table uses both OwnerID and PetID. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "afnOhO3v8LMQ" }, "outputs": [], "source": [ "ddl = \"\"\"CREATE TABLE Pets (\n", " OwnerID VARCHAR(36) NOT NULL, \n", " PetID VARCHAR(36) NOT NULL, \n", " PetType VARCHAR(1024) NOT NULL,\n", " PetName VARCHAR(1024) NOT NULL,\n", " Breed VARCHAR(1024) NOT NULL,\n", " PRIMARY KEY (OwnerID, PetID)\n", " ) \n", " INTERLEAVE IN PARENT Owners ON DELETE CASCADE\"\"\"\n", "\n", "\n", "\n", "run_ddl_statement(instance_id, database_id, ddl)" ] }, { "cell_type": "markdown", "metadata": { "id": "hWEAc578B1Ij" }, "source": [ "## Display the database schema" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "1J_oDtTK9KVZ" }, "outputs": [], "source": [ "def get_database_ddl(instance_id, database_id):\n", " \"\"\"Gets the database DDL statements.\"\"\"\n", " spanner_client = spanner.Client(project=project_id)\n", " instance = spanner_client.instance(instance_id)\n", " database = instance.database(database_id)\n", " ddl = spanner_client.database_admin_api.get_database_ddl(database=database.name)\n", "\n", " print(\"Retrieved database DDL for {}\".format(database_id))\n", "\n", " for statement in ddl.statements:\n", " print(statement)\n", "\n", "\n", "get_database_ddl(instance_id, database_id)" ] }, { "cell_type": "markdown", "metadata": { "id": "GZRGAvhjB8ET" }, "source": [ "## Add some test records" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "LO-z1x629VKF" }, "outputs": [], "source": [ "import uuid\n", "\n", "def insert_data(instance_id, database_id):\n", " doug_id = str(uuid.uuid4())\n", " john_id = str(uuid.uuid4())\n", " sue_id = str(uuid.uuid4())\n", "\n", " spanner_client = spanner.Client(project=project_id)\n", " instance = spanner_client.instance(instance_id)\n", " database = instance.database(database_id)\n", "\n", " with database.batch() as batch:\n", " batch.insert(\n", " table=\"Owners\",\n", " columns=(\"OwnerID\", \"OwnerName\"),\n", " values=[\n", " (doug_id, u\"Doug\"),\n", " (john_id, u\"John\"),\n", " (sue_id, u\"Sue\"),\n", " ],\n", " )\n", "\n", " batch.insert(\n", " table=\"Pets\",\n", " columns=(\"PetID\", \"OwnerID\", \"PetType\", \"PetName\", \"Breed\"),\n", " values=[\n", " (str(uuid.uuid4()), doug_id, u\"Dog\", u\"Noir\", u\"Schnoodle\"),\n", " (str(uuid.uuid4()), doug_id, u\"Dog\", u\"Bree\", u\"Mutt\"),\n", " (str(uuid.uuid4()), doug_id, u\"Cat\", u\"Tom\", u\"Alley\"),\n", " (str(uuid.uuid4()), john_id, u\"Dog\", u\"Duke\", u\"GoldenDoodle\"),\\\n", " (str(uuid.uuid4()), john_id, u\"Dog\", u\"Sparky\", u\"Poodle\"),\n", " (str(uuid.uuid4()), john_id, u\"Turtle\", u\"Cuff\", u\"Box\"),\n", " (str(uuid.uuid4()), john_id, u\"Turtle\", u\"Link\", u\"Box\"),\n", " (str(uuid.uuid4()), sue_id, u\"Cat\", u\"Cleo\", u\"Domestic\"),\n", " ],\n", " )\n", "\n", " print(\"Inserted data.\")\n", "\n", "\n", "insert_data(instance_id, database_id)" ] }, { "cell_type": "markdown", "metadata": { "id": "kXeryKjV_aqU" }, "source": [ "## Go to the Google Cloud Console and verify that the Spanner instance, database, tables, and records were all created. " ] }, { "cell_type": "markdown", "metadata": { "id": "68K_pvCuCUUq" }, "source": [ "## Runs the query passed as an argument\n", "\n", "This function runs any SELECT query passed as an argument. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "cbNHZ51G-GAq" }, "outputs": [], "source": [ "def run_query(sql):\n", " # Instantiate a client.\n", " spanner_client = spanner.Client(project=project_id)\n", "\n", " # Get a Cloud Spanner instance by ID.\n", " instance = spanner_client.instance(instance_id)\n", "\n", " # Get a Cloud Spanner database by ID.\n", " database = instance.database(database_id)\n", "\n", " # Execute a simple SQL statement.\n", " with database.snapshot() as snapshot:\n", " results = snapshot.execute_sql(sql)\n", " for row in results:\n", " print(row)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "k3QOelQ6CeKG" }, "source": [ "## Query with a join" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Ofdj6ok2-OEj" }, "outputs": [], "source": [ "sql = \"\"\"SELECT Owners.OwnerID, OwnerName, PetName, PetType, Breed \n", " FROM Owners \n", " JOIN Pets ON Owners.OwnerID = Pets.OwnerID;\"\"\"\n", "\n", "run_query(sql)" ] }, { "cell_type": "markdown", "metadata": { "id": "-mB52ZWOC3rL" }, "source": [ "## Delete all of the data" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "cwpex85KC6N7" }, "outputs": [], "source": [ "def delete_data_with_dml(instance_id, database_id):\n", " \n", " spanner_client = spanner.Client(project=project_id)\n", " instance = spanner_client.instance(instance_id)\n", " database = instance.database(database_id)\n", "\n", " def delete_owners(transaction):\n", " \n", " row_ct = transaction.execute_update(\n", " \"DELETE FROM Owners WHERE true = true\"\n", " )\n", "\n", " print(\"{} record(s) deleted.\".format(row_ct))\n", "\n", " database.run_in_transaction(delete_owners)\n", "\n", "# Call the function\n", "delete_data_with_dml(instance_id, database_id)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "HfjCtt0CDmgm" }, "source": [ "## Delete the database" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "LZjVAHLoDszL" }, "outputs": [], "source": [ "def delete_database(instance_id, database_id):\n", " \n", " spanner_client = spanner.Client(project=project_id)\n", " instance = spanner_client.instance(instance_id)\n", " database = instance.database(database_id)\n", " \n", " database.drop()\n", "\n", " print(\"{} database dropped\".format(database_id))\n", "\n", "\n", "# Call the function\n", "delete_database(instance_id, database_id)" ] }, { "cell_type": "markdown", "metadata": { "id": "QawIviJTD1lb" }, "source": [ "## Delete the instance" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "-98p13_kD4-X" }, "outputs": [], "source": [ "def delete_spanner_instance(instance_id):\n", " \n", " spanner_client = spanner.Client(project=project_id)\n", " instance = spanner_client.instance(instance_id)\n", " instance.delete()\n", "\n", " print(\"{} instance deleted\".format(instance_id))\n", "\n", "# Call the function\n", "delete_spanner_instance(instance_id)" ] }, { "cell_type": "markdown", "metadata": { "id": "GS9LUsmhAAL5" }, "source": [ "## Go to the Console and verify that the Spanner instance was deleted. " ] } ], "metadata": { "colab": { "authorship_tag": "ABX9TyP4j/aAs/M//3GybY2BdAT1", "collapsed_sections": [], "include_colab_link": true, "provenance": [] }, "kernelspec": { "display_name": "Python 3.8.2 64-bit", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2" }, "vscode": { "interpreter": { "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" } } }, "nbformat": 4, "nbformat_minor": 4 }