sqlalchemy не видит таблицы (InvalidRequestError)

С sqlalchemy знакомлюсь второй день, поэтому не судите строго, буду рад конструктивной критике кода. Есть 2 файла, в первом создаются все необходимые таблицы, во втором потаюсь выполнить запрос на добавление элемента в таблицу. (Добавляю в таблицу Unit знак процента)

create_table.py

from sqlalchemy import create_engine
from sqlalchemy import Column, ForeignKey, Integer, String, Date, Text, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy.schema import DropTable
from sqlalchemy.ext.compiler import compiles

engine = create_engine("postgresql+psycopg2://postgres:xxx@localhost:xxx/db_user_social_network", echo=True)
Base = declarative_base()


@compiles(DropTable, "postgresql")
def _compile_drop_table(element, compiler, **kwargs):
    return compiler.visit_drop_table(element) + " CASCADE"


class Type(Base):
    __tablename__ = "types"
    type_id = Column(Integer, primary_key=True)
    type = Column(String(255))

    type_objec = relationship("Type_object")


class Type_object(Base):
    __tablename__ = "type object"
    object_id = Column(Integer, primary_key=True)
    type_id = Column(Integer, ForeignKey("types.type_id"))

    user = relationship("User")
    post = relationship("Post")
    repost = relationship("Repost")
    group = relationship("Group")
    group_post = relationship("Group_post")
    comment_post_group = relationship("Comment_post_group")
    rating_criteria = relationship("Rating_criteria")


class User(Base):
    __tablename__ = 'user'
    user_id = Column(Integer, ForeignKey("type object.object_id"), primary_key=True)
    name = Column(String(255), nullable=False)  # всегда должно быть заполнено
    surname = Column(String(255))
    patronymic = Column(String(255))
    dob = Column(Date)  # дата рождения

    personal_data = relationship("Personal_data")
    interest = relationship("Interest")
    post = relationship("Post")
    repost = relationship("Repost")
    like = relationship("Like")
    comment_post_group = relationship("Comment_post_group")


class Personal_data(Base):  # пользователя
    __tablename__ = "personal data"
    user_id = Column(Integer, ForeignKey("user.user_id"), primary_key=True)
    phone = Column(String(255))
    email = Column(String(255))
    country = Column(String(255))
    city = Column(String(255))
    school = Column(Text)
    university = Column(Text)
    faculty = Column(Text)
    career = Column(Text)
    military_service = Column(Text)


class Interest(Base):  # пользователя
    __tablename__ = "interests"
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey("user.user_id"))
    date = Column(Date)
    favorite_books = Column(Text)
    favorite_films = Column(Text)
    favorite_music = Column(Text)


class Post(Base):  # пользователя
    __tablename__ = "posts"
    user_post_id = Column(Integer, ForeignKey("type object.object_id"), primary_key=True)  # id поста пользователя
    user_id = Column(Integer, ForeignKey("user.user_id"))
    text = Column(Text)
    photo = Column(Text)  # ссылка на фото в папке пользователя
    video = Column(Text)
    audio = Column(Text)


class Repost(Base):
    __tablename__ = "reposts"
    repost_id = Column(Integer, ForeignKey("type object.object_id"), primary_key=True)
    user_id = Column(Integer, ForeignKey("user.user_id"))
    post_group_id = Column(Integer, ForeignKey("group posts.post_group_id"))
    text = Column(Text)
    date = Column(Date)


class Group(Base):
    __tablename__ = 'groups'
    group_id = Column(Integer, ForeignKey("type object.object_id"), primary_key=True)
    name = Column(String(500))
    description = Column(Text)
    coloration = Column(Text)

    group_post = relationship("Group_post")
    comment_post_group = relationship("Comments posts group")


class Group_post(Base):  # посты групп
    __tablename__ = "group posts"
    post_group_id = Column(Integer, ForeignKey("type object.object_id"), primary_key=True)
    group_id = Column(Integer, ForeignKey("groups.group_id"))
    text = Column(Text)
    date = Column(Date)
    photo = Column(Text)
    video = Column(Text)
    audio = Column(Text)

    repost = relationship("Repost")
    like = relationship("Like")
    comment_post_group = relationship("Comment_post_group")


class Like(Base):
    __tablename__ = "likes"
    like_id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey("user.user_id"))
    post_group_id = Column(Integer, ForeignKey("group posts.post_group_id"))


class Comment_post_group(Base):  # комментарии постов в группе
    __tablename__ = "comments posts group"
    comment_id = Column(Integer, ForeignKey("type object.object_id"), primary_key=True)
    user_id = Column(Integer, ForeignKey("user.user_id"))
    post_group_id = Column(Integer, ForeignKey("group posts.post_group_id"))
    text = Column(Text)
    date = Column(Date)
    photo = Column(Text)
    video = Column(Text)
    audio = Column(Text)


class Criteria(Base):
    __tablename__ = "criteria"
    criteria_id = Column(Integer, primary_key=True)
    name = Column(Text)

    rating_category = relationship("Rating_category")
    category_criteria = relationship("Category_criteria")


class Category(Base):
    __tablename__ = "categories"
    category_id = Column(Integer, primary_key=True)
    name = Column(Text)

    rating_category = relationship("Rating_category")
    category_criteria = relationship("Category_criteria")


class Unit(Base):  # ед измерения
    __tablename__ = "units"
    unit_id = Column(Integer, primary_key=True)
    name = Column(Text)

    category_criteria = relationship("Category_criteria")


class Rating_category(Base):  # оценка категории
    __tablename__ = "rating category"
    rating_category_id = Column(Integer, primary_key=True)
    category_id = Column(Integer, ForeignKey("categories.category_id"))
    criteria_id = Column(Integer, ForeignKey("criteria.criteria_id"))
    date = Column(Date)
    value = Column(Float)


class Category_criteria(Base):  # категория-критерий
    __tablename__ = "category criteria"
    cc_id = Column(Integer, primary_key=True)  # id категории - критерия
    category_id = Column(Integer, ForeignKey("categories.category_id"))
    criteria_id = Column(Integer, ForeignKey("criteria.criteria_id"))
    unit_id = Column(Integer, ForeignKey("units.unit_id"))

    rule = relationship("Rule")
    rating_criteria = relationship("Rating_criteria")


class Rule(Base):  # правила
    __tablename__ = "regulations"
    rule_id = Column(Integer, primary_key=True)
    cc_id = Column(Integer, ForeignKey("category criteria.cc_id"))
    of = Column(Integer)  # от
    before = Column(Integer)  # до
    evaluation_values = Column(Integer)
    verbal_interpretation = Column(Text)


class Rating_criteria(Base):
    __tablename__ = "rating criteria"
    rating_criteria_id = Column(Integer, primary_key=True)
    cc_id = Column(Integer, ForeignKey("category criteria.cc_id"))
    object_id = Column(Integer, ForeignKey("type object.object_id"))
    date = Column(Date)
    value = Column(Integer)


Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)

commands.py

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from create_table import Base, Type, Comment_post_group, Type_object, User, Personal_data, Interest, Post, Repost, Group, Group_post, Like, \
     Criteria, Category, Unit, Rating_category, Category_criteria, Rule, Rating_criteria
engine = create_engine("postgresql+psycopg2://postgres:xxxxxxxx@localhost:xxx/db_user_social_network", echo=True)

session = sessionmaker(bind=engine)
s = session()

lan = Unit(type="%")
s.add(lan)
s.commit()

Но при выполнении второго файла, выдает ошибку:

sqlalchemy.exc.InvalidRequestError: When initializing mapper mapped class Group->groups, expression 'Comments posts group' failed to locate a name ('Comments posts group'). If this is a class name, consider adding this relationship() to the <class 'create_table.Group'> class after both dependent classes have been defined.

Я знаю что тема поднималась на гите но не понял к чему они там пришли. Спасибо за помощь.


Ответы (0 шт):