Skip to main content

Google Cloud Spanner API client library

Project description

GA pypi versions

Cloud Spanner is the world’s first fully managed relational database service to offer both strong consistency and horizontal scalability for mission-critical online transaction processing (OLTP) applications. With Cloud Spanner you enjoy all the traditional benefits of a relational database; but unlike any other relational database service, Cloud Spanner scales horizontally to hundreds or thousands of servers to handle the biggest transactional workloads.

Quick Start

In order to use this library, you first need to go through the following steps:

  1. Select or create a Cloud Platform project.

  2. Enable billing for your project.

  3. Enable the Google Cloud Spanner API.

  4. Setup Authentication.

Installation

Install this library in a virtualenv using pip. virtualenv is a tool to create isolated Python environments. The basic problem it addresses is one of dependencies and versions, and indirectly permissions.

With virtualenv, it’s possible to install this library without needing system install permissions, and without clashing with the installed system dependencies.

Supported Python Versions

Python >= 3.7

Deprecated Python Versions

Python == 2.7. Python == 3.5. Python == 3.6.

Mac/Linux

pip install virtualenv
virtualenv <your-env>
source <your-env>/bin/activate
<your-env>/bin/pip install google-cloud-spanner

Windows

pip install virtualenv
virtualenv <your-env>
<your-env>\Scripts\activate
<your-env>\Scripts\pip.exe install google-cloud-spanner

Example Usage

Executing Arbitrary SQL in a Transaction

Generally, to work with Cloud Spanner, you will want a transaction. The preferred mechanism for this is to create a single function, which executes as a callback to database.run_in_transaction:

# First, define the function that represents a single "unit of work"
# that should be run within the transaction.
def update_anniversary(transaction, person_id, unix_timestamp):
    # The query itself is just a string.
    #
    # The use of @parameters is recommended rather than doing your
    # own string interpolation; this provides protections against
    # SQL injection attacks.
    query = """SELECT anniversary FROM people
        WHERE id = @person_id"""

    # When executing the SQL statement, the query and parameters are sent
    # as separate arguments. When using parameters, you must specify
    # both the parameters themselves and their types.
    row = transaction.execute_sql(
        query=query,
        params={'person_id': person_id},
        param_types={
            'person_id': types.INT64_PARAM_TYPE,
        },
    ).one()

    # Now perform an update on the data.
    old_anniversary = row[0]
    new_anniversary = _compute_anniversary(old_anniversary, years)
    transaction.update(
        'people',
        ['person_id', 'anniversary'],
        [person_id, new_anniversary],
    )

# Actually run the `update_anniversary` function in a transaction.
database.run_in_transaction(update_anniversary,
    person_id=42,
    unix_timestamp=1335020400,
)

Select records using a Transaction

Once you have a transaction object (such as the first argument sent to run_in_transaction), reading data is easy:

# Define a SELECT query.
query = """SELECT e.first_name, e.last_name, p.telephone
    FROM employees as e, phones as p
    WHERE p.employee_id == e.employee_id"""

# Execute the query and return results.
result = transaction.execute_sql(query)
for row in result.rows:
    print(row)

Insert records using Data Manipulation Language (DML) with a Transaction

Use the execute_update() method to execute a DML statement:

spanner_client = spanner.Client()
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)

def insert_singers(transaction):
    row_ct = transaction.execute_update(
        "INSERT Singers (SingerId, FirstName, LastName) "
        " VALUES (10, 'Virginia', 'Watson')"
    )

    print("{} record(s) inserted.".format(row_ct))

database.run_in_transaction(insert_singers)

Insert records using Mutations with a Transaction

To add one or more records to a table, use insert:

transaction.insert(
    'citizens',
    columns=['email', 'first_name', 'last_name', 'age'],
    values=[
        ['phred@exammple.com', 'Phred', 'Phlyntstone', 32],
        ['bharney@example.com', 'Bharney', 'Rhubble', 31],
    ],
)

Update records using Data Manipulation Language (DML) with a Transaction

spanner_client = spanner.Client()
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)

def update_albums(transaction):
    row_ct = transaction.execute_update(
        "UPDATE Albums "
        "SET MarketingBudget = MarketingBudget * 2 "
        "WHERE SingerId = 1 and AlbumId = 1"
    )

    print("{} record(s) updated.".format(row_ct))

database.run_in_transaction(update_albums)

Update records using Mutations with a Transaction

Transaction.update updates one or more existing records in a table. Fails if any of the records does not already exist.

transaction.update(
    'citizens',
    columns=['email', 'age'],
    values=[
        ['phred@exammple.com', 33],
        ['bharney@example.com', 32],
    ],
)

Connection API

Connection API represents a wrap-around for Python Spanner API, written in accordance with PEP-249, and provides a simple way of communication with a Spanner database through connection objects:

from google.cloud.spanner_dbapi.connection import connect

connection = connect("instance-id", "database-id")
connection.autocommit = True

cursor = connection.cursor()
cursor.execute("SELECT * FROM table_name")

result = cursor.fetchall()

Aborted Transactions Retry Mechanism

In !autocommit mode, transactions can be aborted due to transient errors. In most cases retry of an aborted transaction solves the problem. To simplify it, connection tracks SQL statements, executed in the current transaction. In case the transaction aborted, the connection initiates a new one and re-executes all the statements. In the process, the connection checks that retried statements are returning the same results that the original statements did. If results are different, the transaction is dropped, as the underlying data changed, and auto retry is impossible.

Auto-retry of aborted transactions is enabled only for !autocommit mode, as in autocommit mode transactions are never aborted.

Next Steps

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

google_cloud_spanner-3.51.0.tar.gz (593.3 kB view details)

Uploaded Source

Built Distribution

google_cloud_spanner-3.51.0-py2.py3-none-any.whl (432.6 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file google_cloud_spanner-3.51.0.tar.gz.

File metadata

  • Download URL: google_cloud_spanner-3.51.0.tar.gz
  • Upload date:
  • Size: 593.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for google_cloud_spanner-3.51.0.tar.gz
Algorithm Hash digest
SHA256 346c2c20f64847883464fb0de5a6f9b48ecc6f79b032a2fb3a0aa088d9a9863f
MD5 cac1e8c2353f96111abec422eec29351
BLAKE2b-256 90f9b30df85501ee1200328dd3bc69424dccc8a0b3389cd52f70d740a90fac87

See more details on using hashes here.

File details

Details for the file google_cloud_spanner-3.51.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for google_cloud_spanner-3.51.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 2d01f33582526ebe7fab62034e92e722e512c21f6bc4abe27e03d86ef7ea576a
MD5 3dd117d1dc030a59ed1a45dd5e9391a2
BLAKE2b-256 ccb0b0328d320d80d6963e7c4eb1e07a40d791f2c2847cda6af033141b02852a

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page