我有一个数据库包,其中包含一些模块,即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模块需要元数据来创建引擎,并且还需要学生模块来定义,但是我没有看到这样做的方法而没有创建循环依赖。
我能做些什么来纠正这种情况。
答案 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)
我只是将常量移到单独的文件中,现在一切正常。