playground/db_engine.py (18 lines of code) (raw):

# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Database engine utility. """ from urllib.parse import parse_qsl, urlparse from sqlalchemy.engine import Engine, create_engine def create_db_engine(db_url: str) -> Engine: """ Create a SQLAlchemy engine for the given database URL. """ # SQLAlchemy doesn't understand postgres:// scheme db_url = db_url.replace("postgres://", "postgresql://") # Use MySQL connector for mysql:// scheme db_url = db_url.replace("mysql://", "mysql+mysqlconnector://") # Remove query args base_url = db_url.split("?")[0] # `parseTime` parameter is not understood by MySQL driver, # so we have to parse query args to remove it connect_args = dict(parse_qsl(urlparse(db_url).query)) if "parseTime" in connect_args: del connect_args["parseTime"] if "loc" in connect_args: del connect_args["loc"] if "tls" in connect_args: del connect_args["tls"] connect_args["ssl"] = {"verify_cert": "False"} try: return create_engine(base_url, connect_args=connect_args) except Exception as e: raise IOError("Unable to make a database connection") from e