11import os , datetime
22import pytest
33from unittest import skipIf
4- from sqlalchemy import create_engine , select , Column
4+ from sqlalchemy import create_engine , select , insert , Column , MetaData , Table
55from sqlalchemy .orm import declarative_base , Session
6- from sqlalchemy .types import SMALLINT , Integer , BigInteger , Float , DECIMAL , BOOLEAN , String
6+ from sqlalchemy .types import SMALLINT , Integer , BOOLEAN , String
77
88
99@pytest .fixture
@@ -12,8 +12,10 @@ def db_engine():
1212 HOST = os .environ .get ("host" )
1313 HTTP_PATH = os .environ .get ("http_path" )
1414 ACCESS_TOKEN = os .environ .get ("access_token" )
15+ CATALOG = os .environ .get ("catalog" )
16+ SCHEMA = os .environ .get ("schema" )
1517
16- engine = create_engine (f"databricks+thrift://token:{ ACCESS_TOKEN } @{ HOST } ?http_path={ HTTP_PATH } " )
18+ engine = create_engine (f"databricks+thrift://token:{ ACCESS_TOKEN } @{ HOST } ?http_path={ HTTP_PATH } &catalog= { CATALOG } &schema= { SCHEMA } " )
1719 return engine
1820
1921
@@ -26,23 +28,57 @@ def base(db_engine):
2628def session (db_engine ):
2729 return Session (bind = db_engine )
2830
31+ @pytest .fixture ()
32+ def metadata_obj (db_engine ):
33+ return MetaData (bind = db_engine )
34+
2935
3036def test_can_connect (db_engine ):
3137 simple_query = "SELECT 1"
3238 result = db_engine .execute (simple_query ).fetchall ()
3339 assert len (result ) == 1
3440
35- @skipIf (True , 'metadata operations not yet supported' )
36- def test_create_insert_drop_table (base , session : Session ):
37- """Make sure we can automatically create and drop a table defined with SQLAlchemy's MetaData object
38- while exercising all supported types.
41+
42+ def test_create_insert_drop_table_core (base , db_engine , metadata_obj : MetaData ):
43+ """
44+ """
45+
46+ SampleTable = Table (
47+ "PySQLTest_{}" .format (datetime .datetime .utcnow ().strftime ("%s" )),
48+ metadata_obj ,
49+ Column ("name" , String (255 )),
50+ Column ("episodes" , Integer ),
51+ Column ("some_bool" , BOOLEAN )
52+ )
53+
54+ metadata_obj .create_all ()
55+
56+ insert_stmt = insert (SampleTable ).values (name = "Bim Adwunmi" , episodes = 6 , some_bool = True )
57+
58+ with db_engine .connect () as conn :
59+ conn .execute (insert_stmt )
60+
61+ select_stmt = select (SampleTable )
62+ resp = db_engine .execute (select_stmt )
63+
64+ result = resp .fetchall ()
65+
66+ assert len (result ) == 1
67+
68+ metadata_obj .drop_all ()
69+
70+
71+ @skipIf (True , 'Unity catalog must be supported' )
72+ def test_create_insert_drop_table_orm (base , session : Session ):
73+ """ORM classes built on the declarative base class must have a primary key.
74+ This is restricted to Unity Catalog.
3975 """
4076
4177 class SampleObject (base ):
4278
4379 __tablename__ = "PySQLTest_{}" .format (datetime .datetime .utcnow ().strftime ("%s" ))
4480
45- name = Column (String , primary_key = True )
81+ name = Column (String ( 255 ) , primary_key = True )
4682 episodes = Column (Integer ),
4783 some_bool = Column (BOOLEAN )
4884
0 commit comments