InvalidRequestError при добавлении данных в базу данных с помощью SQLAlchemy и SQL-сервера - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь построить отношения многие ко многим с sqlalchemy с pyodbc и SQL Server, и вот мой код:

from sqlalchemy import Table, Text
from sqlalchemy import ForeignKey
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
courses_students = Table('courses_students',Base.metadata,
                        Column('stu_id',ForeignKey('student.id'),primary_key=True),
                        Column('cour_id',ForeignKey('course.id'),primary_key=True),
                        Column('grade',Integer())
    )

# from sqlalchemy.ext.declarative import declarative_base
# Base = declarative_base()

class Student(Base):
    __tablename__ = 'student'

    stu_id = Column('id',Integer,primary_key=True)
    name = Column('name',String(10))
    stu_class = Column('class',String(10))
    #courses = relationship('Course',secondary=courses_students,back_populates='students')

    def __init__(self,stu_id,name,stu_class):
        self.stu_id = stu_id
        self.name = name
        self.stu_class = stu_class

    def __repr__(self):
        _str = "Student({_id},{_name},{_class})".format(_id=self.stu_id,_name=self.name,
                                                        _class=self.stu_class)
        return _str

# from sqlalchemy.ext.declarative import declarative_base
# Base = declarative_base()

class Course(Base):
    __tablename__ = 'course'

    cour_id = Column('id',Integer,primary_key=True)
    name = Column('name',String(20))
    teacher_name = Column('teacher_name',String(10))
    credit = Column('credit',Integer())

    students = relationship('Student',secondary=courses_students,backref='courses')

    def __init__(self,c_id,name,t_name,credit):
        self.cour_id = c_id
        self.name = name
        self.teacher_name = t_name
        self.credit = credit

    def __repr__(self):
        _str = "Course({_id},{_na},{_t_na},{_cre})".format(_id=self.cour_id,_na=self.name,
                                                          _t_na=self.teacher_name,
                                                          _cre=self.credit)
        return _str

Однако, когда я пытался добавить данные с session.add(),Я обнаружил следующие ошибки:

InvalidRequestError: Один или несколько сопоставителей не удалось инициализировать - не удается продолжить инициализацию других сопоставителей.Запуск картографа: «Картограф | Студент | Студент».Первоначальное исключение было следующим: при инициализации mapper Mapper | Student | student в выражении 'course' не удалось найти имя ("name" course "не определено").Если это имя класса, рассмотрите возможность добавления этого отношения () в класс после определения обоих зависимых классов.

1 Ответ

0 голосов
/ 06 июня 2018

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

relationship() ожидает сопоставленный класс или строку, которая разрешается, например, в качестве первого аргумента, но вы передали его 'course', который разрешается в Table класс отображается на.Кажется, что в вашем примере здесь вы исправили ссылку на 'Course'.

Строковый аргумент, именующий класс, переданный relationship(), разрешается во время времени компиляции mapper путем его поискаиз реестра классов, связанного с Base.Но в вашем примере вы создали отдельные Base классы для каждой из ваших моделей и ассоциативного Table, поэтому поиск завершился неудачно, поскольку все классы находятся в отдельных реестрах.

Ошибка возникает при использованииSession впервые, потому что мапперы настроены лениво.Кроме того, configure_mappers() может использоваться для явной настройки любых ожидающих изменений.

В вашем определении Course скрывается другая ошибка: вместо back_populates='courses', который вы использовалиbackref='courses' и так во время настройки возникает следующая ошибка:

Traceback (most recent call last):
  File "wtf.py", line 60, in <module>
    configure_mappers()
  File "~/Work/sqlalchemy/lib/sqlalchemy/orm/mapper.py", line 3029, in configure_mappers
    mapper._post_configure_properties()
  File "~/Work/sqlalchemy/lib/sqlalchemy/orm/mapper.py", line 1828, in _post_configure_properties
    prop.init()
  File "~/Work/sqlalchemy/lib/sqlalchemy/orm/interfaces.py", line 184, in init
    self.do_init()
  File "~/Work/sqlalchemy/lib/sqlalchemy/orm/relationships.py", line 1659, in do_init
    self._generate_backref()
  File "~/Work/sqlalchemy/lib/sqlalchemy/orm/relationships.py", line 1849, in _generate_backref
    (backref_key, self, m))
sqlalchemy.exc.ArgumentError: Error creating backref 'courses' on relationship 'Course.students': property of that name exists on mapper 'Mapper|Student|student'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...