2828from dataloom .loom .interfaces import ILoom
2929from dataloom .loom .math import math
3030from dataloom .loom .qb import qb
31+ from dataloom .utils import is_collection
3132
3233
3334class Loom (ILoom ):
@@ -1292,7 +1293,7 @@ def connect(
12921293 return self .conn
12931294
12941295 def connect_and_sync (
1295- self , models : list [Model ], drop = False , force = False , alter = False
1296+ self , models : list [Model ] | Model , drop = False , force = False , alter = False
12961297 ) -> tuple [
12971298 Any | PooledMySQLConnection | MySQLConnectionAbstract | Connection , list [str ]
12981299 ]:
@@ -1304,8 +1305,8 @@ def connect_and_sync(
13041305
13051306 Parameters
13061307 ----------
1307- models : list[Model]
1308- A list of Python classes that inherit from a Model class with some Column fields defined as the column names of the table.
1308+ models : list[Model] | Model
1309+ A collection of Python classes or a Python Class that inherit from a Model class with some Column fields defined as the column names of the table.
13091310 drop : bool, optional
13101311 Whether or not to drop existing tables when the method is called again. Defaults to False.
13111312 force : bool, optional
@@ -1348,21 +1349,19 @@ def connect_and_sync(
13481349 ... conn.close()
13491350
13501351 """
1351- try :
1352- self .conn = self .connect ()
1353- self .sql_obj = SQL (
1354- conn = self .conn ,
1355- dialect = self .dialect ,
1356- sql_logger = self .sql_logger ,
1357- logs_filename = self .logs_filename ,
1358- )
1359- tables = self .sync (models = models , drop = drop , force = force , alter = alter )
1360- return self .conn , tables
1361- except Exception as e :
1362- raise Exception (e )
1352+
1353+ self .conn = self .connect ()
1354+ self .sql_obj = SQL (
1355+ conn = self .conn ,
1356+ dialect = self .dialect ,
1357+ sql_logger = self .sql_logger ,
1358+ logs_filename = self .logs_filename ,
1359+ )
1360+ tables = self .sync (models = models , drop = drop , force = force , alter = alter )
1361+ return self .conn , tables
13631362
13641363 def sync (
1365- self , models : list [Model ], drop = False , force = False , alter = False
1364+ self , models : list [Model ] | Model , drop = False , force = False , alter = False
13661365 ) -> list [str ]:
13671366 """
13681367 sync
@@ -1372,8 +1371,8 @@ def sync(
13721371
13731372 Parameters
13741373 ----------
1375- models : list[Model]
1376- A list of Python classes that inherit from a Model class with some Column fields defined as the column names of the table.
1374+ models : list[Model] | Model
1375+ A collection of Python classes or a Python Class that inherit from a Model class with some Column fields defined as the column names of the table.
13771376 drop : bool, optional
13781377 Whether or not to drop existing tables before synchronization. Defaults to False.
13791378 force : bool, optional
@@ -1413,52 +1412,59 @@ def sync(
14131412 ... )
14141413
14151414 """
1416- try :
1417- for model in models :
1418- if drop or force :
1415+ if not is_collection (models ):
1416+ models = [models ]
1417+
1418+ for model in models :
1419+ if force :
1420+ if self .dialect == "mysql" :
1421+ # temporarily disable fk checks.
1422+ self ._execute_sql ("SET FOREIGN_KEY_CHECKS = 0;" , _verbose = 0 )
1423+ self ._execute_sql (model ._drop_sql (dialect = self .dialect ))
1424+ sql = model ._create_sql (dialect = self .dialect )
1425+ self ._execute_sql (sql )
1426+ self ._execute_sql ("SET FOREIGN_KEY_CHECKS = 1;" , _verbose = 0 )
1427+ else :
14191428 self ._execute_sql (model ._drop_sql (dialect = self .dialect ))
1420- for sql in model ._create_sql (dialect = self .dialect ):
1421- if sql is not None :
1422- self ._execute_sql (sql )
1423- elif alter :
1424- # 1. we only alter the table if it does exists
1425- # 2. if not we just have to create a new table
1426- if model ._get_table_name () in self .tables :
1427- sql1 = model ._get_describe_stm (
1428- dialect = self .dialect , fields = ["column_name" ]
1429- )
1430- args = None
1429+ sql = model ._create_sql (dialect = self .dialect )
1430+ self ._execute_sql (sql )
1431+ elif drop or force :
1432+ self ._execute_sql (model ._drop_sql (dialect = self .dialect ))
1433+ sql = model ._create_sql (dialect = self .dialect )
1434+ self ._execute_sql (sql )
1435+ elif alter :
1436+ # 1. we only alter the table if it does exists
1437+ # 2. if not we just have to create a new table
1438+ if model ._get_table_name () in self .tables :
1439+ sql1 = model ._get_describe_stm (
1440+ dialect = self .dialect , fields = ["column_name" ]
1441+ )
1442+ args = None
1443+ if self .dialect == "mysql" :
1444+ args = (self .database , model ._get_table_name ())
1445+ elif self .dialect == "postgres" :
1446+ args = ("public" , model ._get_table_name ())
1447+ elif self .dialect == "sqlite" :
1448+ args = ()
1449+ cols = self ._execute_sql (sql1 , _verbose = 0 , args = args , fetchall = True )
1450+ if cols is not None :
14311451 if self .dialect == "mysql" :
1432- args = ( self . database , model . _get_table_name ())
1452+ old_columns = [ col for ( col ,) in cols ]
14331453 elif self .dialect == "postgres" :
1434- args = ("public" , model ._get_table_name ())
1435- elif self .dialect == "sqlite" :
1436- args = ()
1437- cols = self ._execute_sql (
1438- sql1 , _verbose = 0 , args = args , fetchall = True
1439- )
1440- if cols is not None :
1441- if self .dialect == "mysql" :
1442- old_columns = [col for (col ,) in cols ]
1443- elif self .dialect == "postgres" :
1444- old_columns = [col for (col ,) in cols ]
1445- else :
1446- old_columns = [col [1 ] for col in cols ]
1447- sql = model ._alter_sql (
1448- dialect = self .dialect , old_columns = old_columns
1449- )
1450- self ._execute_sql (sql , _is_script = True )
1451- else :
1452- for sql in model ._create_sql (dialect = self .dialect ):
1453- if sql is not None :
1454- self ._execute_sql (sql )
1454+ old_columns = [col for (col ,) in cols ]
1455+ else :
1456+ old_columns = [col [1 ] for col in cols ]
1457+ sql = model ._alter_sql (
1458+ dialect = self .dialect , old_columns = old_columns
1459+ )
1460+ self ._execute_sql (sql , _is_script = True )
14551461 else :
1456- for sql in model ._create_sql (dialect = self .dialect ):
1457- if sql is not None :
1458- self . _execute_sql ( sql )
1459- return self .tables
1460- except Exception as e :
1461- raise Exception ( e )
1462+ sql = model ._create_sql (dialect = self .dialect )
1463+ self . _execute_sql ( sql )
1464+ else :
1465+ sql = model . _create_sql ( dialect = self .dialect )
1466+ self . _execute_sql ( sql )
1467+ return self . tables
14621468
14631469 def sum (
14641470 self ,
0 commit comments