Adding HappyBase Connection.create_table(). by dhermes Β· Pull Request #1502 Β· googleapis/google-cloud-python

@googlebot googlebot added the cla: yes

This human has signed the Contributor License Agreement.

label

Feb 19, 2016

@dhermes

dhermes added a commit that referenced this pull request

Feb 24, 2016
Adding HappyBase Connection.create_table().

@dhermes dhermes deleted the happybase-create-table branch

February 24, 2016 17:40

parthea pushed a commit that referenced this pull request

Nov 26, 2025

parthea added a commit that referenced this pull request

Mar 2, 2026

parthea pushed a commit that referenced this pull request

Mar 6, 2026

parthea added a commit that referenced this pull request

Mar 6, 2026
#1541)

* bug: fixes discrepancy btwn python-api-core & bigquery re object default timeout

* Fix: loosen ipywidget dependency (#1504)

* fix: updates ipywidget dependency

* fix: updates ipywidget version number

* chore(main): release 3.6.0 (#1490)

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>

* docs: Remove < 3.11 reference from README (#1502)

* chore(python): upgrade gcp-releasetool in .kokoro [autoapprove] (#1508)

Source-Link: googleapis/synthtool@5f2a608
Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:8555f0e37e6261408f792bfd6635102d2da5ad73f8f09bcb24f25e6afb5fac97

Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>

* feat: add `connection_properties` and `create_session` to `LoadJobConfig` (#1509)

* feat: added `connection_properties` and `create_session` in load job

* chore(deps): update all dependencies (#1501)

* chore(deps): update all dependencies

* πŸ¦‰ Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

---------

Co-authored-by: Anthonios Partheniou <partheniou@google.com>
Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>

* chore(deps): update all dependencies (#1513)

* feat: add default_query_job_config property and property setter to BQ client (#1511)

Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly:
- [x] Make sure to open an issue as a [feature request](https://togithub.com/googleapis/python-bigquery/issues/1512) before writing your code!  That way we can discuss the change, evaluate designs, and agree on the general idea
- [x] Ensure the tests and linter pass
- [x] Code coverage does not decrease (if any source code was changed)
- [x] Appropriate docs were updated (if necessary)

Fixes 
- [feature request](https://togithub.com/googleapis/python-bigquery/issues/1512)πŸ¦•
- [internal bug](https://b.corp.google.com/issues/271044948)

* chore(deps): update all dependencies (#1514)

* chore(deps): update dependency charset-normalizer to v3.1.0 (#1518)

* chore(main): release 3.7.0 (#1507)

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>

* feat: expose configuration property on CopyJob, ExtractJob, LoadJob, QueryJob (#1521)

* feat: expose configuration property on CopyJob, ExtractJob, LoadJob, QueryJob

Note for google-cloud-bigquery developers: This also refactors these classes so
that `_set_properties` does not modify the `_properties` dictionary in-place.
Doing so was also mutating the request object, making it difficult to debug
what request was _actually_ sent. Before this change, many tests hallucinated
that the request was always equal to the response.

* E           google.api_core.exceptions.BadRequest: 400 Clone operation with write disposition WRITE_TRUNCATE is not supported. Please try again with WRITE_EMPTY.

* chore(deps): Update nox in .kokoro/requirements.in [autoapprove] (#1527)

Source-Link: googleapis/synthtool@92006bb
Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:2e247c7bf5154df7f98cce087a20ca7605e236340c7d6d1a14447e5c06791bd6

Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>

* feat: add default LoadJobConfig to Client (#1526)

* feat: add bool, int, float, string dtype to to_dataframe (#1529)

* fix: loosen ipywidgets restrictions further to address ipython compatibility issues (#1531)

* fix: loosen ipywidgets restrictions further to address ipython compatibility issues

* include ipywidgets in prerelease deps

* show all package versions

* add ipykernel dependency

* ipykernel in noxfile

* oops

* chore(main): release 3.8.0 (#1525)

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>

* fix: keyerror when the load_table_from_dataframe accesses a unmapped dtype dataframe index (#1535)

* feat: expose query job on dbapi cursor (#1520)

Co-authored-by: Tim Swast <swast@google.com>

* chore(main): release 3.9.0 (#1537)

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>

* chore: update tests to be compatible with pandas 2.0 (#1538)

* chore: update tests to be compatible with pandas 2.0

* use StringDtype without storage argument

* avoid Float64Dtype on older pandas

* chore(deps): update all dependencies (#1522)

* chore: updates minimum version of bqstorage (#1542)

* chore: updates minimum version of bqstorage

* removes unneeded test

* updates linting, removes unneeded comment

* updates conditional checks, comments, adds test

* Removes test, adds pragma no cover

* Removes test

* fix linting error

---------

Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Atsushi Yamamoto <yamaatsushi927@gmail.com>
Co-authored-by: gcf-owl-bot[bot] <78513119+gcf-owl-bot[bot]@users.noreply.github.com>
Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
Co-authored-by: Shobhit Singh <just.shobhit@gmail.com>
Co-authored-by: Mend Renovate <bot@renovateapp.com>
Co-authored-by: Anthonios Partheniou <partheniou@google.com>
Co-authored-by: chelsea-lin <124939984+chelsea-lin@users.noreply.github.com>
Co-authored-by: Tim Swast <swast@google.com>
Co-authored-by: r1b <robert.cole.jensen@gmail.com>

parthea pushed a commit that referenced this pull request

Mar 9, 2026
#1502)

* feat: Add new field `contexts` for Object Contexts in message `Object`
feat: Add new field `filter` for Object Contexts in message `ListObjectsRequest`

PiperOrigin-RevId: 781971065

Source-Link: googleapis/googleapis@f2a87ff

Source-Link: googleapis/googleapis-gen@9cab897
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiOWNhYjg5N2Y0YTAxZDNhMmU5NzBkMjg5ZjRjMzk4OGQ0NGFmOGM2NCJ9

chore: update the GAPIC generator version for C#

PiperOrigin-RevId: 778777226

docs: Various documentation and comment improvements, Enable organization-level support for VPC Flow Logs
feat: Enable organization-level support for VPC Flow Logs
feat: add field `service_uri` to message `Endpoint.CloudRunRevisionEndpoint`
feat: add message `Endpoint.SingleEdgeResponse`
feat: add http additional_bindings
feat: add enum `Status` to message `InstanceInfo`
feat: add field `running` to message `InstanceInfo`
feat: add field `policy_priority` to message `NetworkInfo`
feat: add enum value `RouteInfo.NextHopType.SECURE_WEB_PROXY_GATEWAY`
feat: add enum `DeliverInfo.GoogleServiceType`
feat: add field `google_service_type` to message `DeliverInfo`
feat: add enum value `AbortInfo.Cause.GOOGLE_MANAGED_SERVICE_AMBIGUOUS_ENDPOINT`
feat: add enum values `NO_ROUTE_FROM_EXTERNAL_IPV6_SOURCE_TO_PRIVATE_IPV6_ADDRESS`, `TRAFFIC_FROM_HYBRID_ENDPOINT_TO_INTERNET_DISALLOWED`, `NO_MATCHING_NAT64_GATEWAY`, `LOAD_BALANCER_BACKEND_IP_VERSION_MISMATCH`, and `NO_KNOWN_ROUTE_FROM_NCC_NETWORK_TO_DESTINATION` to `DropInfo.Cause`
feat: add rpc `VpcFlowLogsService.QueryOrgVpcFlowLogsConfigs`
feat: add service `OrganizationVpcFlowLogsService`
feat: add enum `VpcFlowLogsConfig.CrossProjectMetadata`
feat: add enum `VpcFlowLogsConfig.TargetResourceState`
feat: add fields `cross_project_metadata`, `target_resource_state`, `network`, and `subnet` to message `VpcFlowLogsConfig`

PiperOrigin-RevId: 778807926

feat: A new field `semantic_search` is added to `message.google.cloud.dataplex.v1.SearchEntriesRequest`

PiperOrigin-RevId: 778817135

fix: pagination response for Compute Subnetworks.ListUsable (39952d9)

PiperOrigin-RevId: 778931614

fix!: Correct resource reference type for `parent` field in `data_chat_service.proto`

PiperOrigin-RevId: 780026729

feat: update libraries and clients for Managed Kafka

PiperOrigin-RevId: 780098649

chore: regenerate gapic yaml and service yaml for cloudtrace v2 by augmentation configs

PiperOrigin-RevId: 780150418

chore: regenerate gapic yaml and service yaml for iam by augmentation configs

PiperOrigin-RevId: 780151180

chore: regenerate gapic yaml and service yaml for cloudtrace v1 by augmentation configs

PiperOrigin-RevId: 780152154

feat: Update Compute Engine v1 API to revision 20250626

feat: Update Compute Engine v1beta API to revision 20250626

docs: Add more details for BidiReadObjectRedirectedError and BidiWriteObjectRedirectedError
docs: Add more information for AppendObjectSpec fields
fix!: Remove field `restricted` within encryption enforcement config.
feat: Add new field `restriction_mode` for encryption enforcement config in message Bucket

PiperOrigin-RevId: 780246504

feat: Add isolation support to prevent cross-region overflow by adding a new field "isolation_config" to message "ServiceLbPolicy"

PiperOrigin-RevId: 780262024

feat: Add safebrowsing proto defs

PiperOrigin-RevId: 780289284

feat: add RDN sequence
feat: add User Defined Access URLs
feat: add backdate duration
feat: adds tbs_certificate_digest to CertificateDescription

PiperOrigin-RevId: 780300269

chore: update the GAPIC generator version for C#

PiperOrigin-RevId: 780414513

Source-Link: googleapis/googleapis@f1decb8

Source-Link: googleapis/googleapis-gen@96e33aa
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiOTZlMzNhYWIyNTUxMmIzOTgxMGYxNTk3MWFmNjNhMzRmY2E1Y2Y1ZiJ9

* πŸ¦‰ Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* πŸ¦‰ Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* πŸ¦‰ Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* πŸ¦‰ Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* πŸ¦‰ Updates from OwlBot post-processor

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

---------

Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>

chalmerlowe pushed a commit that referenced this pull request

Mar 23, 2026
Fixes #15871

## Summary

`Connection.transaction_checkout()` currently calls
`Transaction.begin()` explicitly before the first query, which sends a
standalone `BeginTransaction` gRPC RPC. This is unnecessary because the
`Transaction` class already supports **inline begin** β€” piggybacking
`BeginTransaction` onto the first `ExecuteSql`/`ExecuteBatchDml` request
via `TransactionSelector(begin=...)`.

This PR removes the explicit `begin()` call, letting the existing inline
begin logic in `execute_sql()`, `execute_update()`, and `batch_update()`
handle transaction creation. This saves **one gRPC round-trip per
transaction** (~16ms measured on the emulator).

### What changed

**`google/cloud/spanner_dbapi/connection.py`** β€”
`transaction_checkout()`:
- Removed `self._transaction.begin()` on
[L413](https://github.com/googleapis/python-spanner/blob/v3.63.0/google/cloud/spanner_dbapi/connection.py#L413)
- The transaction is now returned with `_transaction_id=None`
- Updated docstring to explain the inline begin behavior

**`tests/unit/spanner_dbapi/test_connection.py`**:
- Added `test_transaction_checkout_does_not_call_begin` to assert
`begin()` is not called

**`tests/mockserver_tests/test_dbapi_inline_begin.py`** (new):
- 9 mockserver tests verifying inline begin behavior for read-write
transactions
- Covers: no `BeginTransactionRequest` sent, first `ExecuteSqlRequest`
uses `TransactionSelector(begin=...)`, transaction ID reuse on second
statement, rollback, read-only unaffected, retry after abort

**`tests/mockserver_tests/test_tags.py`**:
- Updated 4 read-write tag tests: removed `BeginTransactionRequest` from
expected RPC sequences, adjusted tag index offsets

**`tests/mockserver_tests/test_dbapi_isolation_level.py`**:
- Updated 4 isolation level tests: verify isolation level on
`ExecuteSqlRequest.transaction.begin.isolation_level` instead of
`BeginTransactionRequest.options.isolation_level`

### Why this is safe

The inline begin code path already exists and is battle-tested β€”
`Session.run_in_transaction()` creates a `Transaction` without calling
`begin()` and relies on the same inline begin logic ([session.py
L566](https://github.com/googleapis/python-spanner/blob/v3.63.0/google/cloud/spanner_v1/session.py#L566)).

Specific safety analysis:

1. **`transaction_checkout()` callers always execute SQL immediately**:
It's only called from `run_statement()` β†’ `execute_sql()` and
`batch_dml_executor` β†’ `batch_update()`. Both set `_transaction_id` via
inline begin before any commit/rollback path.

2. **`execute_sql`/`execute_update`/`batch_update` handle
`_transaction_id is None`**: They acquire a lock, use
`_make_txn_selector()` which returns `TransactionSelector(begin=...)`,
and store the returned `_transaction_id` ([transaction.py
L612-L623](https://github.com/googleapis/python-spanner/blob/v3.63.0/google/cloud/spanner_v1/transaction.py#L612-L623)).

3. **`rollback()` handles `_transaction_id is None`**: Skips the RPC β€”
correct when no server-side transaction exists ([transaction.py
L163](https://github.com/googleapis/python-spanner/blob/v3.63.0/google/cloud/spanner_v1/transaction.py#L163)).

4. **`commit()` handles `_transaction_id is None`**: Falls back to
`_begin_mutations_only_transaction()` for mutation-only transactions
([transaction.py
L263-L267](https://github.com/googleapis/python-spanner/blob/v3.63.0/google/cloud/spanner_v1/transaction.py#L263-L267)).

5. **Retry mechanism is compatible**: `_set_connection_for_retry()`
resets `_spanner_transaction_started=False`, so replayed statements go
through `transaction_checkout()` again, create a fresh `Transaction`,
and use inline begin.

### PEP 249 conformance

This change is fully conformant with [PEP 249 (DB-API
2.0)](https://peps.python.org/pep-0249/). The spec does not define a
`begin()` method β€” transactions are implicit. The PEP author [clarified
on the DB-SIG mailing
list](https://mail.python.org/pipermail/db-sig/2010-September/005645.html)
that *"transactions start implicitly after you connect and after you
call `.commit()` or `.rollback()`"*, and the mechanism by which the
driver starts the server-side transaction is an implementation detail.
Deferring the server-side begin to the first SQL execution (as psycopg2
and other mature DB-API drivers do) is the standard approach. The
observable transactional semantics β€” atomicity between
`commit()`/`rollback()` calls β€” are unchanged.

### Performance impact

Before (4 RPCs per read-write transaction):
```
BeginTransaction β†’ ExecuteSql (read) β†’ ExecuteSql (write) β†’ Commit
```

After (3 RPCs per read-write transaction):
```
ExecuteSql (read, with inline begin) β†’ ExecuteSql (write) β†’ Commit
```

Measured ~16ms savings per transaction on the Spanner emulator.

### Context

This optimization was identified while profiling SQLAlchemy/DBAPI
performance against Spanner. The DBAPI was created ~2 years before
inline begin support was added to the Python client library (inline
begin landed in [PR
googleapis/python-spanner#740](googleapis/python-spanner#740),
Dec 2022). The `run_in_transaction` path was updated to use inline
begin, but `transaction_checkout` was not.

## Test plan

- [x] All 198 DBAPI unit tests pass (`tests/unit/spanner_dbapi/`)
- [x] New unit test verifies `begin()` is not called by
`transaction_checkout()`
- [x] 9 new mockserver tests verify inline begin RPC behavior
(`tests/mockserver_tests/test_dbapi_inline_begin.py`)
- [x] 8 existing mockserver tests updated for inline begin expectations
(`test_tags.py`, `test_dbapi_isolation_level.py`)
- [x] All 53 DBAPI system tests pass against Spanner emulator
(`tests/system/test_dbapi.py`)
- [ ] CI system tests (will run automatically)

---------

Co-authored-by: rahul2393 <irahul@google.com>
Co-authored-by: Knut Olav LΓΈite <koloite@gmail.com>

parthea pushed a commit that referenced this pull request

Apr 1, 2026
PR created by the Librarian CLI to initialize a release. Merging this PR
will auto trigger a release.

Librarian Version: v0.0.0-20260331223231-14b1b9186e21
Language Image:
us-central1-docker.pkg.dev/cloud-sdk-librarian-prod/images-prod/python-librarian-generator@sha256:234b9d1f2ddb057ed7ac6a38db0bf8163d839c65c6cf88ade52530cddebce59e
<details><summary>google-cloud-spanner: v3.64.0</summary>

##
[v3.64.0](google-cloud-spanner-v3.63.0...google-cloud-spanner-v3.64.0)
(2026-04-01)

### Features

* use inline begin to eliminate BeginTransaction RPC (#1502)
([00d5f8e6](00d5f8e6))

* add TLS/mTLS support for experimental host (#1479)
([0c4c5da](0c4c5da3))

* add Client Context support to options (#1499)
([0da5f78](0da5f785))

* Exposing total CPU related fields in AutoscalingConfig
(PiperOrigin-RevId: 845819318)
([9d2338a](9d2338a6))

* include cache updates into the ResultSet response (PiperOrigin-RevId:
865546011)
([9d2338a](9d2338a6))

* add a ClientContext field to Spanner requests (PiperOrigin-RevId:
853323071)
([9d2338a](9d2338a6))

* include cache updates and routing hint into BeginTransaction and
Commit request/response respectively (PiperOrigin-RevId: 878019893)
([9d2338a](9d2338a6))

* add Secure Parameters to the ClientContext (PiperOrigin-RevId:
853323071)
([9d2338a](9d2338a6))

* implement native asyncio support via Cross-Sync (#1509)
([f822fd7](f822fd7c))

### Bug Fixes

* add threading import and _resource_info to snapshot.py
([659034a](659034aa))

* restore implicit database_dialect reload in sync client (#1537)
([67f5104](67f51043))

* resolve async deadlock in multiplexed session manager (#1520)
([c8f936b](c8f936b0))

### Documentation

* mark new AsyncIO APIs as experimental (#1533)
([3909c04](3909c045))

* A comment for field `transaction_tag` in message
`.google.spanner.v1.RequestOptions` is changed (PiperOrigin-RevId:
865546011)
([9d2338a](9d2338a6))

* A comment for field `routing_hint` in messages
`.google.spanner.v1.ResultSet` and `.google.spanner.v1.PartialResultSet`
are changed (PiperOrigin-RevId: 878019893)
([9d2338a](9d2338a6))

* Update high_priority_cpu_utilization_percent in AutoscalingConfig to
be Optional and clarify its behavior when not specified
(PiperOrigin-RevId: 845819318)
([9d2338a](9d2338a6))

* A comment for field `params` in message
`.google.spanner.v1.PartitionQueryRequest` is changed
(PiperOrigin-RevId: 865546011)
([9d2338a](9d2338a6))

* A comment in message
`.google.spanner.v1.TransactionOptions.ReadWrite.ReadLockMode` is
changed (PiperOrigin-RevId: 878019893)
([9d2338a](9d2338a6))

* A comment for field `commit_timestamp` in message
`.google.spanner.v1.BatchWriteResponse` is changed (PiperOrigin-RevId:
865546011)
([9d2338a](9d2338a6))

* minor update for Spanner Location API (PiperOrigin-RevId: 834841888)
([9d2338a](9d2338a6))

* A comment for field `param_types` in message
`.google.spanner.v1.PartitionQueryRequest` is changed
(PiperOrigin-RevId: 865546011)
([9d2338a](9d2338a6))

</details>

parthea pushed a commit that referenced this pull request

Apr 1, 2026