Skip to content

Commit b37807e

Browse files
committed
Simple integration test examples.
Signed-off-by: Jesse Whitehouse <[email protected]>
1 parent 0378460 commit b37807e

File tree

4 files changed

+65
-14
lines changed

4 files changed

+65
-14
lines changed

src/databricks/sqlalchemy/dialect.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
from databricks import sql
22
from typing import AnyStr
33

4-
from sqlalchemy import types
5-
from sqlalchemy import util
6-
4+
from sqlalchemy import util, exc, types
75
from sqlalchemy.engine import default
86

97

108
class DatabricksDialect(default.DefaultDialect):
119

1210
# Possible attributes are defined here: https://docs.sqlalchemy.org/en/14/core/internals.html#sqlalchemy.engine.Dialect
1311
name: str = "databricks"
14-
driver: str= "thrift"
12+
driver: str = "thrift"
1513
default_schema_name: str = "default"
1614

1715
@classmethod
@@ -24,7 +22,7 @@ def create_connect_args(self, url):
2422
kwargs = {
2523
"server_hostname": url.host,
2624
"access_token": url.password,
27-
"http_path": url.query.get("http_path")
25+
"http_path": url.query.get("http_path"),
2826
}
2927

3028
return [], kwargs
@@ -43,3 +41,19 @@ def get_columns(self, *args, **kwargs):
4341
def do_rollback(self, dbapi_connection):
4442
# Databricks SQL Does not support transaction
4543
pass
44+
45+
def has_table(self, connection, table_name, schema=None, **kwargs) -> bool:
46+
"""Required for `tests.sqlalchemy.integration.test_create_table` to pass.
47+
"""
48+
try:
49+
COLUMN_NAME = 3
50+
with self.get_driver_connection(
51+
connection
52+
)._dbapi_connection.dbapi_connection.cursor() as cur:
53+
data = cur.columns(
54+
schema_name=schema or "default", table_name=table_name
55+
).fetchmany(1)
56+
# the table exists as long as there's a non-zero number of columns
57+
return len(data) > 0
58+
except exc.NoSuchTableError:
59+
return False

tests/sqlalchemy/conftest.py

Lines changed: 0 additions & 7 deletions
This file was deleted.

tests/sqlalchemy/integration.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import os, datetime, pytest
2+
import sqlalchemy
3+
4+
5+
@pytest.fixture
6+
def db_engine():
7+
8+
host = os.getenv("host")
9+
http_path = os.getenv("http_path")
10+
api_token = os.getenv("api_token")
11+
engine = sqlalchemy.create_engine(f"databricks+thrift://token:{api_token}@{host}?http_path={http_path}")
12+
return engine
13+
14+
def test_basic_connection(db_engine):
15+
"""Make sure we can connect and run basic query
16+
"""
17+
18+
curs = db_engine.execute("SELECT id FROM RANGE(100)")
19+
result = curs.fetchall()
20+
assert len(result) == 100
21+
22+
def test_create_and_drop_table(db_engine):
23+
"""Make sure we can automatically create and drop a table defined with SQLAlchemy's MetaData object
24+
"""
25+
26+
mdo = sqlalchemy.MetaData()
27+
this_moment = datetime.datetime.utcnow().strftime("%s")
28+
29+
tname = f"integration_test_table_{this_moment}"
30+
31+
t1 = sqlalchemy.Table(
32+
tname,
33+
mdo,
34+
sqlalchemy.Column('f_short', sqlalchemy.types.SMALLINT),
35+
sqlalchemy.Column('f_int', sqlalchemy.types.Integer),
36+
sqlalchemy.Column('f_long', sqlalchemy.types.BigInteger),
37+
sqlalchemy.Column('f_float', sqlalchemy.types.Float),
38+
sqlalchemy.Column('f_decimal', sqlalchemy.types.DECIMAL),
39+
sqlalchemy.Column('f_boolean', sqlalchemy.types.BOOLEAN)
40+
)
41+
42+
mdo.create_all(bind=db_engine,checkfirst=True)
43+
44+
check_it_exists = db_engine.execute(f"DESCRIBE TABLE EXTENDED {tname}")
45+
46+
mdo.drop_all(db_engine, checkfirst=True)

tests/sqlalchemy/test_suite.py

Lines changed: 0 additions & 2 deletions
This file was deleted.

0 commit comments

Comments
 (0)