У меня много проблем с изучением внешних ключей и отношений в SQLAlchemy. У меня в базе данных две таблицы. Первый - Request, а второй - Agent. Каждый Request содержит один Agent, а каждый Agent - один Request.

class Request(db.Model):
    __tablename__ = 'request'
    reference = db.Column(db.String(10), primary_key=True)
    applicationdate = db.Column(db.DateTime)
    agent = db.ForeignKey('request.agent'),

class Agent(db.Model):
    __tablename__ = 'agent'
    id =     db.relationship('Agent', backref='request', \
    lazy='select')
    name = db.Column(db.String(80))
    company = db.Column(db.String(80))
    address = db.Column(db.String(180))

Когда я запускаю db.create_all(), я получаю следующую ошибку

Не удалось инициализировать целевой столбец для ForeignKey «request.agent» в таблице «заявитель»: таблица «запрос» не имеет столбца с именем «агент»

16
user6723321 10 Янв 2017 в 15:46

1 ответ

Лучший ответ

Ознакомьтесь с документацией SqlAlchemy по отношениям OneToOne. Сначала вам нужно предоставить Primary Key для каждой модели. Затем вам нужно определить один Foreign Key, который ссылается на Primary Key другой модели. Теперь вы можете определить связь с обратной ссылкой, которая обеспечивает прямой доступ к связанной модели.

class Request(db.Model):
    __tablename__ = 'request'
    id = db.Column(db.Integer, primary_key=True)
    applicationdate = db.Column(db.DateTime)

class Agent(db.Model):
    __tablename__ = 'agent'
    id = db.Column(db.Integer, primary_key=True)   
    request_id = db.Column(db.Integer, db.ForeignKey('request.id'))
    request = db.relationship("Request", backref=backref("request", uselist=False))

    name = db.Column(db.String(80))
    company = db.Column(db.String(80))
    address = db.Column(db.String(180))

Теперь вы можете получить доступ к своим моделям следующим образом:

request = Request.query.first()
print(request.agent.name)

agent = Agent.query.first()
print(agent.request.applicationdate)
33
BcK 15 Дек 2021 в 15:45
4
В этом случае следующие две строки должны выглядеть так: request_id = db.Column(db.Integer, db.ForeignKey('request.id')) и request = db.relationship("Request", backref=db.backref("request", uselist=False)), потому что база данных импортируется как db.
 – 
ibedelovski
3 Янв 2020 в 18:55
1
Но @MrLeeh, скажите, пожалуйста, почему backref = "request", а не "Request"?
 – 
yts61
5 Май 2020 в 14:58
1
Имя таблицы - «запрос». Это то, что вам нужно здесь передать.
 – 
MrLeeh
5 Май 2020 в 21:21