python3-driver icon indicating copy to clipboard operation
python3-driver copied to clipboard

Variable 'dsn' needs to be initialized in create_database(). Otherwise 'UnboundLocalError: cannot access local variable' possible if 'database' arg. points to an ALIAS

Open pavel-zotov opened this issue 3 months ago • 0 comments

Please consider func create_database().

There is following code starting from line 2400:

    db_config: DatabaseConfig = driver_config.get_database(database)
    if db_config is None:
        db_config = driver_config.db_defaults
        srv_config = driver_config.server_defaults
        if _is_dsn(database):
            dsn = database
            database = None
            srv_config.host.clear()
    else:
         . . .

If control falls into the branch "if db_config is None" and then into "if _is_dsn(database)" -- all fine. But if _is_dsn(database) returns False then we have a problem: dsn remains undefined until following call at line 2435:

    dsn = _connect_helper(dsn, srv_config.host.value, srv_config.port.value,
                          database, db_config.protocol.value)

This code will raise "UnboundLocalError: cannot access local variable 'dsn' where it is not associated with a value"

Function _is_dsn() may return False if value of database argument represents an ALIAS rather than file (e.g. db_main_alias used in replication tests or similar strings).

This is what i propose:

Comparing files core.py and core-upd.py
***** core.py
 2401:      if db_config is None:
 2402:          db_config = driver_config.db_defaults
***** core-upd.py
 2402:      # pzotov, 11.09.2025: we have to initialize here 'dsn' variable otherwise we get error
 2403:      # UnboundLocalError: cannot access local variable 'dsn' where it is not associated with a value
 2404:      # if the 'database' argument is an ALIAS, e.g. 'db_main_alias' etc!
 2405:      dsn: str | None = None
 2407:      if db_config is None:
 2408:          db_config = driver_config.db_defaults
*****

pavel-zotov avatar Sep 11 '25 16:09 pavel-zotov