2016-07-05 3 views
0

Я создал несколько классов, которые я хочу сохранить в базе данных. Я хотел бы иметь возможность запускать приложение с определенным флагом, чтобы взять все эти классы и создать соответствующие таблицы в моем db. С этой целью я пытаюсь импортировать классы, а затем вызывать метод Base.metadata.create_all(engine). Однако это не работает. В то же время, когда я вызываю это из файла с каждым из этих фактических классов, таблицы создаются.SQLAlchemy, Declarative, PostgreSQL: не удается создать таблицы

Как мне решить задачу создания этих таблиц? Должен ли я попытаться создать их из одного файла/скрипта или добавить эту строку в каждый из этих классов?

Вот пример моего кода:

1) Item.py

from sqlalchemy import Column, Integer, String, Float 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class Item(Base): 
    __tablename__ = "items" 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 

    def __repr__(self): 
     return "<~ {} ~> name: {}".format(self.id, self.name) 

2) main.py

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 

def main(): 
    from sqlalchemy.ext.declarative import declarative_base 
    Base = declarative_base() 
    engine = create_engine('postgresql+psycopg2://me:[email protected]/my_first_database', echo=True) 
    from Item import Item 
    print(Item) 
    print(Item.__table__) 
    Base.metadata.create_all(engine) 

main() 

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

+0

Одна из вещей, которые я нашел, заключается в том, что если я скажу 'import Item', а затем' Item .__ base __. Metadata.create_all (engine) 'все работает. Но это выглядит немного грязным взломом. Я думал, что Base будет одинаковым каждый раз, когда я его создам. – Ibolit

ответ

3

Вы уже создали Base в Item.py, просто импортировать его в main.py:

Если main.py и Item.py находятся на одной и той же папке, а затем в main.py:

from Item import Base, Item

И удалить весь импорт в main функция, поэтому main.py будет выглядеть так:

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 
from Item import Base, Item 

def main(): 
    engine = create_engine('postgresql+psycopg2://me:[email protected]/my_first_database', echo=True) 
    print(Item) 
    print(Item.__table__) 
    Base.metadata.create_all(engine) 

main() 
+0

А что, если у меня есть несколько таких DAO? Создать базу в другом месте и затем импортировать ее в каждый из этих классов? – Ibolit

+0

Почему бы вам не сгруппировать их в один файл ... например, 'models.py' и иметь' Base' в этом же файле ..? –

+0

Это мысль. Исходя из Java, наличие нескольких «общедоступных» классов в одном файле не то, что сначала приходит в голову :) – Ibolit

Смежные вопросы