2015-08-01 3 views
2

Я пытаюсь использовать engine_from_config() в конструкторе класса. Учебники и материалы в Интернете настолько запутанны. Я новичок в этом и боролся с тем, что кажется простой задачей. Любая помощь по реализации .engine_from_config() в конструкторе действительно оценена!Работа с sqlalchemy 'engine_from_config'

Это имеет смысл для меня:

class BaseAPI(object): 
    _userclass = None 
    _userassessment = None  
def __init__(self, config, prefix='sqlalchemy.', **kwargs): 
    assert self_userclass is not None 

    config = {'sqlalchemy.url': 
    'sqlite:///./somedb.db', 'sqlalchemy.echo':'True'} 
    self.engine = sqlalchemy.engine_from_config(config) 

    dbSession = scoped_session(sessionmaker(autoflush = True, 
              autocommit = False, 
              bind = engine)) 
    Base.metadata.create_all(bind=engine) 
    print('--start DB Session--') 
    return dbSession 

Но в учебники я прочитал, что способ реализации sqlalchemy.engine_from_config является этим:

options = dict((key[len(prefix):], configuration[key]) 
       for key in configuration 
       if key.startswith(prefix)) 
options['_coerce_config'] = True 
options.update(kwargs) 
url = options.pop('db') 
return create_engine(url, **options) 

Я думаю, что я может быть более думая об этом или, может быть, более позднем для реального класса sqlalchemy.engine_from_config .... Почему мой код не работает для меня?

Новых рабочие Изменения:

class BaseAPI(object): 
    def __init__(self): 
     config = {'sqlalchemy.url':'sqlite:///./somedb.db', 'sqlalchemy.echo':'True'} 

     self.engine = engine_from_config(config, prefix='sqlalchemy.') 
     Session = sessionmaker(autoflush=True,autocommit=False,bind=engine) 
     self.session = Session() 
     Base.metadata.create_all(bind=engine) 

НОВЫЙ ВОПРОС: Должен ли я вернуть мою сессию? Кроме того, не нужно ли мне иметь вызов «create_engine» в моем init? У меня это в другом файле, и я верю, что это работает.

+0

Не могли бы вы прояснить * как * это не работает? Сообщения об ошибках и т. Д. –

+0

Должен ли я возвращать сеанс? Должен ли я добавлять конфиг в параметры init? – thesayhey

ответ

2

Я бы сделал следующее. Используйте более короткий префикс типа «дБ». Не забудьте точку в конце. префикс = 'SQLAlchemy. это значение по умолчанию, поэтому вам не нужно записывать его в свой код. Это также справедливо для пропущенных параметров для sessionmaker.

config = {'db.url':'sqlite:///./somedb.db', 'db.echo':'True'} 
self.engine = engine_from_config(config, prefix='db.') 
Session = sessionmaker(bind=engine) 

Вы должны использовать

Base.metadata.create_all(bind=engine) 

если вы хотите SQLAlchemy создать таблицы для вас. Если база данных существует, вы должны использовать engine_from_config.

Надеюсь, это поможет.