dateutil
will use the OS timezone info, but does carry it's own compressed timezone info file too.
You could list the available names from the utility code that loads this data:
from dateutil.zoneinfo import get_zonefile_instance
zonenames = list(get_zonefile_instance().zones)
You'd need to sort and filter that list a little; there are both abbreviated (3 letter) timezone codes as well as "region/city" entries in this list.
Storing those names in a database is just fine.
Note that this loads all data into memory; if that's not desirable you'd need to load the tar file yourself:
import os
import tarfile
import dateutil.zoneinfo
zi_path = os.path.abspath(os.path.dirname(dateutil.zoneinfo.__file__))
zonesfile = tarfile.TarFile.open(
os.path.join(zi_path, dateutil.zoneinfo.ZONEFILENAME))
zonenames = [zn.name for zn in zonesfile.getmembers()
if not zn.isdir() and zn.name != dateutil.zoneinfo.METADATA_FN]