Setting SQL Modes

Lawrence D'Oliveiro <[email protected]> Tue, 23 Apr 2024 01:18:08 -0000 (UTC)
Newsgroups comp.databases.mysql
Organization A noiseless patient Spider
Message-ID <[email protected]>
MySQL/MariaDB has some nonstandard ways of doing things. But it is
possible to make it conform more closely to standard SQL by changing
some mode settings:

    set_sql_mode(db, set_modes = {"ANSI_QUOTES", "NO_BACKSLASH_ESCAPES"})

where I define the Python functions for getting and setting the SQL
mode as follows:

    def get_sql_mode(conn) :
        "returns a set of the currently-enabled SQL_MODE values."
        # recognized mode values: <https://mariadb.com/kb/en/sql-mode/>
        return \
            set(eval_expr(conn, "@@sql_mode").split(","))
    #end get_sql_mode

    def set_sql_mode(conn, *, clear_modes = None, set_modes = None) :
        "enables/disables specified SQL_MODE values, returning the previous" \
        " settings. clear_modes, if not None, is a set/sequence of modes to" \
        " be disabled, followed by set_modes, if not None, being a set/sequence" \
        " of new modes to be enabled."
        old_modes = get_sql_mode(conn)
          # always uppercase
        new_modes = set(old_modes)
        if clear_modes != None :
            new_modes.difference_update(c.upper() for c in clear_modes)
        #end if
        if set_modes != None :
            new_modes.update(set_modes)
        #end if
        conn.cursor().execute \
          (
                "set sql_mode = %s"
            %
                sql_string(",".join(new_modes))
          )
        return \
            old_modes
    #end set_sql_mode

eval_expr is just a simple function that prepends the word “SELECT”
onto the given string, and returns the result expression.