Ошибка сопоставления в SQLAlchemy при использовании внешнего ключа - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть две модели SQLAlchemy, одна из которых называется первичным ключом.

Это моя родительская модель:

try:
    from sqlalchemy import Column, Integer, Enum, DateTime, String, ForeignKey
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm  import scoped_session, sessionmaker, relationship
    from sqlalchemy.orm import validates, backref
    import datetime
    from lib.dbConnector import Session
    from werkzeug.security import generate_password_hash
except ImportError as err:
    raise err

Base = declarative_base()

class users_table(Base):
    __tablename__ = 'users_table'
    userid = Column(String(50), unique= True, primary_key= True, nullable= False)
    username = Column(String(500), unique= True, nullable= False)
    password = Column(String(500), nullable= False)
    email = Column(String(500), nullable= False, unique= True)
    role = Column(String(10), default= 'user', nullable= False)
    created_on = Column(DateTime, nullable= False, default= datetime.datetime.utcnow)
    updated_on = Column(DateTime, nullable= False, default= datetime.datetime.utcnow)

, а это моя дочерняя таблица:

try:
    from sqlalchemy import Column, Integer, Enum, DateTime, String, ForeignKey
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm  import scoped_session, sessionmaker, relationship
    from sqlalchemy.orm import validates
    import datetime
    from lib.dbConnector import Session
except ImportError as err:
    raise err

Base = declarative_base()

class user_status_table(Base):
    __tablename__ = 'user_status_table'
    id = Column(Integer, primary_key= True, nullable= False, unique= True, autoincrement=True)
    userid = Column(String(50), ForeignKey('models.usersModel.users_table.userid'), nullable= False, unique= True)
    status = Column(String(50), default= 'active', nullable= False)
    updated_on = Column(DateTime, nullable= False, default= datetime.datetime.utcnow)
    userid = relationship('models.usersModel.users_table.users_table', foreign_keys=userid)

Во время работы моего сервера я получаю следующую ошибку

"One or more mappers failed to initialize - can't proceed with initialization of other mappers. Triggering mapper: 'Mapper|user_status_table|user_status_table'. Original exception was: mapper"

Кто-нибудь может подсказать, что я здесь не так делаю?И именно здесь я совершаю переход

userdata = usersModel.users_table(userid, username, password, email, role)
            try:
                self.session.add(userdata)
                self.session.flush()
                userstatusdata = userstatusModel.user_status_table(userdata.userid, 'active')
                self.session.add(userstatusdata)
                self.session.commit()
            except:
                self.session.rollback()
                raise 

1 Ответ

0 голосов
/ 28 апреля 2019

Прежде чем мы перейдем к ответу на ваш вопрос, есть несколько замечаний:

  1. Не делайте попытку / исключая импорт, а затем просто повышайте в условии исключений.Это просто усложняет ваши трассировки
  2. Импорт и определения таблиц содержат много кода, несущественного для вашего вопроса.Не делайте этого.

Я создал два файла с кодом, вычистил их, чтобы удалить вещи, в которых я точно не нуждался.Файл usermodel.py содержит следующее:

from sqlalchemy import Column, Integer, Enum, DateTime, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class users_table(Base):
    __tablename__ = 'users_table'
    userid = Column(String(50), unique= True, primary_key= True, nullable= False)
    username = Column(String(500), unique= True, nullable= False)

Файл userstatus.py содержит:

from usermodel import Base, users_table
from sqlalchemy import Column, Integer, Enum, DateTime, String, ForeignKey
from sqlalchemy.orm  import relationship

class user_status_table(Base):
    __tablename__ = 'user_status_table'
    id = Column(Integer, primary_key= True, nullable= False, unique= True, autoincrement=True)
    userid = Column(String(50), ForeignKey('users_table.userid'), nullable= False, unique= True)
    user = relationship('users_table')

Некоторые выделенные изменения:

  • Я удалилсоздание второй Base переменной и импортирование переменной в userstatus.py, поэтому обе таблицы находятся в одной и той же схеме.Я не думаю, что вам нужно импортировать пользовательскую модель, но я не проверял
  • SQLAlchemy распознает таблицы из атрибута __tablename__.Это не должно быть префиксом с именем класса.

Давайте проверим:

Python 3.6.5 (default, Mar 31 2018, 19:45:04) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import usermodel
>>> import userstatus
>>> usr1 = usermodel.users_table(userid='You', username='Zacharia')
>>> stat1 = userstatus.user_status_table(id=1, user=usr1)
>>> stat1.user
<usermodel.users_table object at 0x7fa2ddbabfd0>
>>> stat1.user.userid
'You'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...