Your second method is the way to go. Python imports are singleton by nature. When a module is imported multiple times it is only executed the first time. Subsequent imports fetch the module object instance from the globals. More on that here.
shared.py:
class Shared:
def __init__(self):
print("Init shared")
def do_stuff(self, from_mod):
print("Do stuff from {0}. I am instance {1}".format(from_mod, self))
shared = Shared()
foo.py
import shared
shared.shared.do_stuff("foo")
bar.py
import foo
import shared
shared.shared.do_stuff("bar")
If we execute bar.py we get:
>>> Init shared
>>> Do stuff from foo. I am instance <shared.Shared instance at 0x10046df38>
>>> Do stuff from bar. I am instance <shared.Shared instance at 0x10046df38>
So in your case you can reference database_module
from anywhere you want and it gets initialized only once, therefore effectively sharing your connection.