Я всегда старался вставлять данные в базу данных Mysql из моего бота телеграммы и всегда запускать Exception. Только tanggald
всегда не удалось вставить. Я неверный формат запроса даты вставки. Как написать правильный формат?
tanggald
столбца tanggald
: Тип данных = DATE
Это фрагмент кода:
def process_lanjut(message):
try:
chat_id = message.chat.id
qlanjut = message.text
user = user_dict[chat_id]
user.qlanjut=qlanjut
d = datetime.datetime.now().date()
next_monday = next_weekday(d, 4)
user.next_monday = next_monday
print(user.next_monday)
with con.cursor() as cursor:
sql = "INSERT INTO diagnosa(sex, tanggald) VALUES('" + user.sex + "','" +next_monday+ "')"
cursor.execute(sql)
con.commit()
con.close()
msg = bot.send_message(chat_id, 'thanks')
bot.register_next_step_handler(msg, send_end)
except Exception as e:
bot.reply_to(message,'oops lanjut')
На выходе командной строки: 2018-04-20 (данные, которые должны быть INSERT для tanggald)
Это не правильный способ вставки данных в таблицу. Хотя ваш способ может работать, он небезопасен и ему не хватает данных ('
, "
и т.д.):
SQL-представление многих типов данных часто отличается от представления строки Python. Типичный пример: одинарные кавычки в строках: в одиночных кавычках SQL используются в качестве строковых литералов-разделителей, поэтому те, которые появляются внутри самой строки, должны быть экранированы, тогда как в одиночных кавычках Python могут быть оставлены без сохранения, если строка разделена двойными кавычками,
Из-за различий, когда-то тонких, между представлениями типов данных, наивный подход к составлению строк запросов, например, использование конкатенации строк Python, является рецептом для ужасных проблем.
Если переменные, содержащие данные для отправки в базу данных, поступают из ненадежного источника (например, формы, опубликованной на веб-сайте), злоумышленник может легко создать неверную строку, либо получить доступ к неавторизованным данным, либо выполнить деструктивные операции с базой данных. Эта форма атаки называется SQL-инъекцией и, как известно, является одной из наиболее распространенных форм атаки на серверы баз данных. Прежде чем продолжить, распечатайте эту страницу в виде заметки и повесьте ее на свой стол.
Поэтому в вашем случае INSERT
должна выглядеть так:
with con.cursor() as cursor:
sql = 'INSERT INTO diagnosa (sex, tanggald) VALUES (%s, %s)'
data = (user.sex, next_monday)
cursor.execute(sql, data)
Дальнейшее чтение:
Подобная статья для PostgreSQL (содержит лучшее объяснение потенциальных проблем)