sqlalchemy - как управлять этим сценарием - циклическая зависимость - PullRequest
0 голосов
/ 03 августа 2011

У меня есть пакет базы данных, который содержит несколько модулей, а именно 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 ]

1 голос
/ 03 августа 2011

Я использовал что-то эквивалентное этому.

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())

Но это не самая чистая вещь в мире, и это одна из причин, почему многие люди используют декларативный стиль.

0 голосов
/ 24 августа 2011

Я только что переместил константу в отдельный файл, теперь все работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...