sqlalchemy - 如何管理此场景 - 循环依赖

时间:2011-08-03 11:05:56

标签: python database sqlalchemy

我有一个数据库包,其中包含一些模块,即student_table和db模块,

在student_table中我定义了它的定义

from sqlalchemy import Table, MetaData, String, Column, Integer
metadata = MetaData()

class User(object):
        def __init__(self, user_id, name):
                self.user_id = user_id
                self.name = name

user_table = Table('twitter_user', metadata,
        Column('id', Integer, primary_key=True), 
        Column('name', String(100))
)

在db.py中我有数据库创建函数,就像这样

def prepareDB():
    """
    sets global variables based to access database
    """
    read_settings()
    engine = create_engine('mysql://'+setting_data["database_username"]+':'+setting_data["database_password"]+'@'+setting_data["database_host"]+'/'+setting_data["database_name"]+'?charset=utf8')
    Session = sessionmaker(bind=engine)
    global session
    session = Session()
    metadata.create_all(engine)
    mapper(database.User, database.user_table)

我的问题是db模块需要元数据来创建引擎,并且还需要学生模块来定义,但是我没有看到这样做的方法而没有创建循环依赖。

我能做些什么来纠正这种情况。

2 个答案:

答案 0 :(得分:1)

我使用了与此相当的东西。

holder = [None]
def getmetadata():
  if holder[0] is None:
    holder[0] = sqlalchemy.MetaData()
  return holder[0]

user_tablef = lambda metadata: Table('twitter_user', metadata,
        Column('id', Integer, primary_key=True), 
        Column('name', String(100))
)

# ...

user_table = user_tablef(getmetadata())

但这不是世界上最干净的事情,这也是很多人使用陈述式风格的原因之一。

答案 1 :(得分:0)

我只是将常量移到单独的文件中,现在一切正常。