Почему я получаю дубликат ошибки внешнего ключа? - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь использовать Python и SQLAlcehmy для вставки содержимого в базу данных, но это выдает мне дублирующую ошибку внешнего ключа.У меня не было проблем, когда я выполнял SQL-запросы для создания таблиц ранее.This is my Python code to create the tables

enter image description here

1 Ответ

0 голосов
/ 04 декабря 2018

Вы получаете дубликат, потому что вы написали код как отношение один-к-одному, когда оно как минимум один-ко-многим.

Sql не позволяет иметь более одноголюбой переменной.Он создает ключи для каждой переменной, и когда вы пытаетесь вставить одну и ту же переменную, но не устанавливаете какой-либо тип отношений между таблицами, он очень расстраивается и выдает ошибку, которую вы получаете.

Приведенный ниже код является отношением один-ко-многим для ваших таблиц, использующих флягу для подключения к базе данных ... если вы сами не используете флягу ... выясните перевод или используйте его.

class ChildcareUnit(db.Model):

    Childcare_id=db.Column('ChildcareUnit_id',db.Integer,primary_key=True)
    fullname = db.Column(String(250), nullable = False)
    shortname = db.Column(String(250), nullable = False)

    _Menu = db.relationship('Menu')

    def __init__(self,fullname,shortname):
        self.fullname = fullname
        self.shortname = shortname

    def __repr__(self):
        return '<ChildcareUnit %r>' % self.id

class Menu(db.Model):

    menu_id = db.Column('menu_id', db.Integer, primary_key=True)
    menu_date = db.Column('Date', Date, nullable=True)

    idChildcareUnit=db.Column(db.Integer,db.Forgeinkey('ChilecareUnit.ChilecareUnit_id'))
    ChilecareUnits = db.relationship('ChildcareUnit')

    def __init__(self,menu_date):
        self.menu_date = menu_date

    def __repr__(self):
        return '<Menu %r>' % self.id

Здесь нужно отметить пару отличий.Столбцы теперь db.Column(), а не Column().Это код Flask на работе.он устанавливает связь между вашей базой данных и столбцом в этой таблице, говоря: «Эй, эти две вещи связаны».

Также посмотрите на переменные db.Relationship(), которые я добавил в обе таблицы.Это то, что говорит вашему ORM, что две таблицы имеют отношение 1-2-много.Они должны находиться в обеих таблицах, а столбец отношений в одной таблице должен содержать список других, чтобы он работал, как вы можете видеть.

Наконец, посмотрите на __repr__.Это то, что вы используете ORM для генерации внешних ключей для вашей базы данных.Также очень важно включить.Ваш код будет либо очень супер медленным без него, либо просто не будет работать все вместе.Есть два разных варианта генерации внешних ключей в sqlalchemy.__repr__ и __str__

__repr__ предназначены для генерации ключей, которые легче читать на машине, что повышает производительность, но может затруднить их чтение и понимание.__str__ предназначен для человека.Это облегчит понимание ваших внешних ключей, но также сделает ваш код немного медленнее.Вы всегда можете использовать __str__ во время разработки, а затем переключить __repr__, когда будете готовы получить окончательную базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...