Skip to content

Commit 7a99410

Browse files
authored
Merge pull request #32 from jmcarp/type-compiler
Add type compiler.
2 parents 0bdb3ea + 4f5f582 commit 7a99410

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

packages/sqlalchemy-bigquery/pybigquery/sqlalchemy_bigquery.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from google.api_core.exceptions import NotFound
1313
from sqlalchemy.exc import NoSuchTableError
1414
from sqlalchemy import types, util
15-
from sqlalchemy.sql.compiler import SQLCompiler, IdentifierPreparer
15+
from sqlalchemy.sql.compiler import SQLCompiler, GenericTypeCompiler, DDLCompiler, IdentifierPreparer
1616
from sqlalchemy.engine.default import DefaultDialect, DefaultExecutionContext
1717
from sqlalchemy.engine.base import Engine
1818
from sqlalchemy.sql.schema import Column
@@ -179,11 +179,45 @@ def visit_label(self, *args, **kwargs):
179179
return result
180180

181181

182+
class BigQueryTypeCompiler(GenericTypeCompiler):
183+
184+
def visit_integer(self, type_, **kw):
185+
return 'INT64'
186+
187+
def visit_float(self, type_, **kw):
188+
return 'FLOAT64'
189+
190+
def visit_text(self, type_, **kw):
191+
return 'STRING'
192+
193+
def visit_string(self, type_, **kw):
194+
return 'STRING'
195+
196+
def visit_BINARY(self, type_, **kw):
197+
return 'BYTES'
198+
199+
def visit_DECIMAL(self, type_, **kw):
200+
return 'NUMERIC'
201+
202+
203+
class BigQueryDDLCompiler(DDLCompiler):
204+
205+
# BigQuery has no support for foreign keys.
206+
def visit_foreign_key_constraint(self, constraint):
207+
return None
208+
209+
# BigQuery has no support for primary keys.
210+
def visit_primary_key_constraint(self, constraint):
211+
return None
212+
213+
182214
class BigQueryDialect(DefaultDialect):
183215
name = 'bigquery'
184216
driver = 'bigquery'
185217
preparer = BigQueryIdentifierPreparer
186218
statement_compiler = BigQueryCompiler
219+
type_compiler = BigQueryTypeCompiler
220+
ddl_compiler = BigQueryDDLCompiler
187221
execution_ctx_cls = BigQueryExecutionContext
188222
supports_alter = False
189223
supports_pk_autoincrement = False

packages/sqlalchemy-bigquery/test/test_sqlalchemy_bigquery.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from pybigquery.api import ApiClient
66
from sqlalchemy.engine import create_engine
77
from sqlalchemy.schema import Table, MetaData, Column
8+
from sqlalchemy.ext.declarative import declarative_base
89
from sqlalchemy import types, func, case, inspect
910
from sqlalchemy.sql import expression, select, literal_column
1011
from sqlalchemy.exc import NoSuchTableError
@@ -382,6 +383,36 @@ def test_dml(engine, session, table_dml):
382383
assert len(result) == 0
383384

384385

386+
def test_create_table(engine):
387+
meta = MetaData()
388+
table = Table(
389+
'test_pybigquery.test_table_create', meta,
390+
Column('integer_c', sqlalchemy.Integer),
391+
Column('float_c', sqlalchemy.Float),
392+
Column('decimal_c', sqlalchemy.DECIMAL),
393+
Column('string_c', sqlalchemy.String),
394+
Column('text_c', sqlalchemy.Text),
395+
Column('boolean_c', sqlalchemy.Boolean),
396+
Column('timestamp_c', sqlalchemy.TIMESTAMP),
397+
Column('datetime_c', sqlalchemy.DATETIME),
398+
Column('date_c', sqlalchemy.DATE),
399+
Column('time_c', sqlalchemy.TIME),
400+
Column('binary_c', sqlalchemy.BINARY)
401+
)
402+
meta.create_all(engine)
403+
meta.drop_all(engine)
404+
405+
# Test creating tables with declarative_base
406+
Base = declarative_base()
407+
408+
class TableTest(Base):
409+
__tablename__ = 'test_pybigquery.test_table_create2'
410+
integer_c = Column(sqlalchemy.Integer, primary_key=True)
411+
float_c = Column(sqlalchemy.Float)
412+
413+
Base.metadata.create_all(engine)
414+
Base.metadata.drop_all(engine)
415+
385416
def test_schemas_names(inspector, inspector_using_test_dataset):
386417
datasets = inspector.get_schema_names()
387418
assert 'test_pybigquery' in datasets

0 commit comments

Comments
 (0)