#python #mysql
Вопрос:
У меня есть несколько таблиц, для которых я должен вставить внешние ключи. Начиная со словаря (т. Е. Части того, который я использую, d_fk = {‘Bien_Immo’: [‘fk_Id_Lot’, ‘Лот’, ‘Идентификатор’]}). Он вводит записи в функцию » create_fk ()», которая вставит клавиши F_keys.
‘Bien_Immo’: таблица, в которую будет вставлен fk ‘fk_Id_Lot’: имя fk ‘Лот’: имя родительской таблицы ‘Идентификатор’: имя родительского столбца
Вот код, возвращающий синтаксис SQL с ошибкой (1064)
def create_fk(name1, name2, name3, name4): url = "mysql pymysql://{user}:{password}@localhost/{db}" engine = create_engine(url.format(user='root', password='******', db='data_immo')) engine.execute(f"ALTER TABLE {name1}" f"ADD COLUMN {name2}," f"ADD CONSTRAINT {name2}" f"ADD FOREIGN KEY ({name2}) REFERENCES {name3}({name4})" f"ON DELETE CASCADE") for key in d_fk.keys(): if isinstance(d_fk[key][0], list): for i in range(len(d_fk[key])): [n2, n3, n4] = [d_fk[key][i][0], d_fk[key][i][1], d_fk[key][i][2]] create_fk(key, n2, n3, n4) else: [n2, n3, n4] = [d_fk[key][0], d_fk[key][1], d_fk[key][2]] create_fk(key, n2, n3, n4)
Спасибо вам за вашу помощь в этом
Ответ №1:
Проблема в SQL заключается в том, что вы хотите добавить столбец, но не указываете для него тип данных.
Чтобы ваш SQL работал, вы должны указать тип данных, соответствующий name4
типу данных столбца.
Например, если name4
bigint
это сработает:
engine.execute(f"ALTER TABLE {name1}" f"ADD COLUMN {name2} bigint," f"ADD CONSTRAINT {name2}" f"ADD FOREIGN KEY ({name2}) REFERENCES {name3}({name4})" f"ON DELETE CASCADE")
Комментарии:
1. Большое спасибо за ответ, я добавил тип INT (engine.execute(f»ИЗМЕНИТЬ ТАБЛИЦУ {name1}» f»ДОБАВИТЬ СТОЛБЕЦ {name2} INT,» f»ДОБАВИТЬ ВНЕШНИЙ КЛЮЧ ({name2}) ССЫЛКИ {name3}({name4}),» f»УДАЛИТЬ НА КАСКАДЕ»)), Но не сработало, все то же сообщение об ошибке
2. Попробуйте убрать запятую», » в конце
REFERENCES {name3}((name4}),"
3. Когда у вас возникают проблемы с созданием инструкций, рекомендуется распечатать инструкцию и скопировать и вставить, чтобы запустить ее в базе данных: вы обнаруживаете много ошибок 🙂
4. Я удалил запятые, закрыл/снова открыл проект, но все та же ошибка.
5. Эти две строки в порядке, когда вы вводите непосредственно в MySQL, ИЗМЕНИТЕ ТАБЛИЦУ Bien_Immo, ДОБАВЬТЕ СТОЛБЕЦ fk_Id_Lot int, ДОБАВЬТЕ ВНЕШНИЙ КЛЮЧ (fk_Id_Lot), ССЫЛАЮЩИЙСЯ НА лот(идентификатор), но если я заменю «fk_Id_Lot», » Лот » и «Идентификатор» их связанными переменными, появится сообщение об ошибке
Ответ №2:
это прекрасно работает
engine.execute(f"ALTER TABLE {name1} ADD COLUMN {name2} int, ADD FOREIGN KEY ({name2}) REFERENCES {name3}({name4}) ON DELETE CASCADE")