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.
Я знаю что тема поднималась на гите но не понял к чему они там пришли. Спасибо за помощь.