Path: blob/main/singlestoredb/alchemy/__init__.py
469 views
#!/usr/bin/env python31import inspect2from typing import Any3from urllib.parse import quote45try:6import sqlalchemy7from sqlalchemy_singlestoredb import * # noqa: F403, F4018has_sqlalchemy = True9except ImportError:10import warnings11warnings.warn(12'sqlalchemy_singlestoredb must be installed to use this module',13RuntimeWarning,14)15has_sqlalchemy = False1617from ..connection import build_params18from ..connection import connect192021def create_engine(*args: Any, **kwargs: Any) -> Any:22"""23Create an SQLAlchemy engine for SingleStoreDB.2425Parameters26----------27**kwargs : Any28The parameters taken here are the same as for29`sqlalchemy.create_engine`. However, this function can be30called without any parameters in order to inherit parameters31set by environment variables or parameters set in by32options in Python code.3334See Also35--------36`sqlalchemy.create_engine`3738Returns39-------40SQLAlchemy engine4142"""43if not has_sqlalchemy:44raise RuntimeError('sqlalchemy_singlestoredb package is not installed')4546if len(args) > 1:47raise ValueError(48'`args` can only have a single element '49'containing the database URL',50)5152if args:53kwargs['host'] = args[0]5455conn_params = {}56sa_params = {}5758conn_args = inspect.getfullargspec(connect).args5960for key, value in kwargs.items():61if key in conn_args:62conn_params[key] = value63else:64sa_params[key] = value6566params = build_params(**conn_params)67driver = params.pop('driver', None)68host = params.pop('host')69port = params.pop('port')70user = params.pop('user', None)71password = params.pop('password', None)72database = params.pop('database', '')7374if not driver:75driver = 'singlestoredb+mysql'76elif not driver.startswith('singlestoredb'):77driver = f'singlestoredb+{driver}'7879if user is not None and password is not None:80url = f'{driver}://{quote(user)}:{quote(password)}@' \81f'{host}:{port}/{quote(database)}'82elif user is not None:83url = f'{driver}://{quote(user)}@{host}:{port}/{quote(database)}'84elif password is not None:85url = f'{driver}://:{quote(password)}@{host}:{port}/{quote(database)}'86else:87url = f'{driver}://{host}:{port}/{quote(database)}'8889return sqlalchemy.create_engine(url, connect_args=params, **sa_params)909192