Я создал несколько классов, которые я хочу сохранить в базе данных. Я хотел бы иметь возможность запускать приложение с определенным флагом, чтобы взять все эти классы и создать соответствующие таблицы в моем 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()
Извините за странный порядок импорта, но я где-то читал, что порядок импорта ваших классов и базы имеет значение, поэтому я попытался поиграть с ним.
Одна из вещей, которые я нашел, заключается в том, что если я скажу 'import Item', а затем' Item .__ base __. Metadata.create_all (engine) 'все работает. Но это выглядит немного грязным взломом. Я думал, что Base будет одинаковым каждый раз, когда я его создам. – Ibolit