def get_connection(self) -> AlchemyConnection: """ Builds an AlchemyConnection as described by the user in the line edits/combo boxes. :return: """ con_name = self.lineEditConnectionName.text() db_type = self.comboBoxDatabaseType.currentText() uri = self.lineEditConnectionURL.text() if db_type == 'sqlite' and uri == '': uri = self.lineEditHost.text() a = AlchemyConnection(name=con_name) if uri is '': port = self.lineEditPort.text() host = self.lineEditHost.text() username = self.lineEditUsername.text() password = self.lineEditPassword.text() database = self.lineEditDefaultDatabase.text() db_api = self.comboBoxDatabaseAPI.currentText() DATABASE = { 'drivername': "{}+{}".format(db_type, db_api), 'host': host or None, 'port': port or None, 'username': username or None, 'password': password or None, 'database': database or None } try: __import__(db_api) except ImportError: logging.error( "Unable to import DBAPI: {} - you need to pip install it.". format(db_api)) DATABASE['drivername'] = db_type uri = URL(**DATABASE) else: if db_type == 'sqlite' and not uri.startswith('sqlite'): uri = uri.replace("\\", "/").replace("//", "/").replace("/", "\\\\") uri = URL('sqlite', database=uri) a.configure_from_url(uri) return a
def check_sqlalchemy_uri(uri: URL) -> None: if uri.startswith("sqlite"): # sqlite creates a local DB, which allows mapping server's filesystem raise DBSecurityException( "SQLite database cannot be used as a data source for security reasons." )