Skip to content

Commit d4681a1

Browse files
committed
Fix docker discovery for bigquery adapter
1 parent 91edcb5 commit d4681a1

File tree

3 files changed

+51
-1
lines changed

3 files changed

+51
-1
lines changed

sqlit/domains/connections/providers/bigquery/adapter.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,16 @@ def connect(self, config: ConnectionConfig) -> BigQueryConnection:
127127
credentials = None
128128
client_options = None
129129

130+
# Check for emulator: either via env var or by detecting a port in config
131+
# (BigQuery doesn't normally use TCP, so any port means emulator)
130132
emulator_host = os.environ.get("BIGQUERY_EMULATOR_HOST")
133+
endpoint = config.tcp_endpoint
134+
if not emulator_host and endpoint and endpoint.port:
135+
# Any port specified means we're connecting to an emulator
136+
# Default to localhost if no explicit host for emulator
137+
host = "localhost"
138+
emulator_host = f"http://{host}:{endpoint.port}"
139+
131140
if emulator_host:
132141
if not emulator_host.startswith("http"):
133142
emulator_host = f"http://{emulator_host}"
Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,62 @@
11
"""Provider registration."""
22

3+
from __future__ import annotations
4+
5+
from typing import TYPE_CHECKING
6+
37
from sqlit.domains.connections.providers.adapter_provider import build_adapter_provider
48
from sqlit.domains.connections.providers.bigquery.schema import SCHEMA
59
from sqlit.domains.connections.providers.catalog import register_provider
10+
from sqlit.domains.connections.providers.docker import DockerCredentials, DockerDetector
611
from sqlit.domains.connections.providers.model import DatabaseProvider, ProviderSpec
712

13+
if TYPE_CHECKING:
14+
from collections.abc import Mapping
15+
816

917
def _provider_factory(spec: ProviderSpec) -> DatabaseProvider:
1018
from sqlit.domains.connections.providers.bigquery.adapter import BigQueryAdapter
1119

1220
return build_adapter_provider(spec, SCHEMA, BigQueryAdapter())
1321

22+
23+
def _bigquery_docker_post_process(
24+
creds: DockerCredentials, env_vars: Mapping[str, str]
25+
) -> DockerCredentials:
26+
"""Extract project ID from emulator command args or use default."""
27+
# The emulator typically uses --project flag, but env vars take precedence
28+
# Default to 'test-project' which is common for local development
29+
return DockerCredentials(
30+
user=creds.user,
31+
password=creds.password,
32+
database=env_vars.get("BIGQUERY_DATASET", creds.database) or "test_sqlit",
33+
)
34+
35+
1436
SPEC = ProviderSpec(
1537
db_type="bigquery",
1638
display_name="Google BigQuery",
1739
schema_path=("sqlit.domains.connections.providers.bigquery.schema", "SCHEMA"),
1840
supports_ssh=False,
1941
is_file_based=False,
2042
has_advanced_auth=True,
21-
default_port="",
43+
default_port="9050",
2244
requires_auth=False,
2345
badge_label="BQ",
2446
url_schemes=("bigquery",),
2547
provider_factory=_provider_factory,
48+
docker_detector=DockerDetector(
49+
image_patterns=("bigquery-emulator", "goccy/bigquery-emulator"),
50+
env_vars={
51+
"user": (),
52+
"password": (),
53+
"database": ("BIGQUERY_DATASET",),
54+
},
55+
default_user="",
56+
default_database="test_sqlit",
57+
preferred_host="test-project", # Use as project ID, not actual host
58+
post_process=_bigquery_docker_post_process,
59+
),
2660
)
2761

2862
register_provider(SPEC)

sqlit/domains/connections/providers/bigquery/schema.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ def _bigquery_auth_is_service_account(config: dict[str, str]) -> bool:
3131
required=False,
3232
description="GCP Project ID (or infer from environment)",
3333
),
34+
SchemaField(
35+
name="port",
36+
label="Emulator Port",
37+
placeholder="9050",
38+
required=False,
39+
description="Port for local BigQuery emulator (leave empty for real BigQuery)",
40+
),
3441
SchemaField(
3542
name="database",
3643
label="Dataset",

0 commit comments

Comments
 (0)