encapsulate backendspecific methods for opening a client shell this should be a string representing the name of the executable e g psql subclasses must override this executablename none def initself connection connection is an instance of basedatabasewrapper self connection connection classmethod def settingstocmdargsenvcls settingsdict parameters raise notimplementederror subclasses of basedatabaseclient must provide a settingstocmdargsenv method or override a runshell def runshellself parameters args env self settingstocmdargsenv self connection settingsdict parameters env os environ env if env else none subprocess runargs envenv checktrue encapsulate backend specific methods for opening a client shell this should be a string representing the name of the executable e g psql subclasses must override this connection is an instance of basedatabasewrapper
import os
import subprocess


class BaseDatabaseClient:
    

    
    
    executable_name = None

    def __init__(self, connection):
        
        self.connection = connection

    @classmethod
    def settings_to_cmd_args_env(cls, settings_dict, parameters):
        raise NotImplementedError(
            "subclasses of BaseDatabaseClient must provide a "
            "settings_to_cmd_args_env() method or override a runshell()."
        )

    def runshell(self, parameters):
        args, env = self.settings_to_cmd_args_env(
            self.connection.settings_dict, parameters
        )
        env = {**os.environ, **env} if env else None
        subprocess.run(args, env=env, check=True)