2012-03-04 6 views
0

есть что-то, что я пытаюсь понять с помощью SQLAlchamy из его документации и учебников.SQLAlchamy Database Construction & Reuse

Я вижу, как автозагружать классы из таблицы БД, и я вижу, как создать класс и создать из него (декларативно или с помощью mapper()) таблицу, которая добавляется в БД.

Мой вопрос: Как написать код, который создает таблицу (например, при первом запуске), а затем повторно использует ее?

Я не хочу создавать базу данных с помощью одного инструмента или одного фрагмента кода и иметь отдельный код для использования базы данных.

Спасибо заранее, Питер

ответ

1

create_all() ничего не делает, если таблица уже существует, поэтому просто вызовите ее, как только вы установите свой двигатель или соединение.

(Обратите внимание, что если вы изменить вашу схему таблицы, create_all() будет не обновление его Так вам все еще нужно «другая программа», чтобы сделать это!.)

Это обычная картина:

def createEngine(metadata, dsn, **args): 
    engine = create_engine(dsn, **args) 
    metadata.create_all(engine) 
    return engine 

def doStuff(engine): 
    res = engine.execute('select * from mytable') 
    # etc etc 

def main(): 
    engine = createEngine(metadata, 'sqlite:///:memory:') 
    doStuff(engine) 

if __name__=='__main__': 
    main() 
+0

Спасибо - я думаю, я искал решение несуществующей проблемы. Какое оптимальное решение, автоматическая загрузка или определение классов явно? Первые, казалось бы, гарантируют соответствие БД и объектов, но последний будет указывать объекты в коде вместо «по магии». – user1247965

+1

Если ваше приложение «владеет» базой данных (т. Е. Оно было создано для него), тогда сделать структуру таблицы явным в коде. Если приложение просто использует существующую базу данных, то, во что бы то ни стало, автозагрузка. Обратите внимание, что в любом случае все еще нет гарантии, что структура таблицы будет соответствовать ожиданиям вашего приложения. Ваше приложение может работать в любом сценарии, если схема отличается от ожидаемого. –

0

Я думаю, что вы, возможно, более здравомыслящие ситуацию. Если вы хотите создать базу данных заново, вы обычно просто вызываете Base.metadata.create_all() или ее эквивалент, и если вы не хотите этого делать, вы не называете это.

Вы можете попробовать позвонить ему каждый раз и обработать исключение, если оно пойдет не так, если предположить, что база данных уже настроена.

Или вы можете попробовать запросить определенную таблицу, и если это не удастся, позвоните create_all(), чтобы положить все на свои места.

Каждая другая часть вашего приложения должна работать одинаково, независимо от того, выполняете ли вы создание базы данных или нет.

+0

Спасибо, что делает смысл ... в первую очередь не проблема! – user1247965