如何插入日期mysql python telegrambot

时间:2018-04-14 09:37:26

标签: python mysql telegram-bot

我总是无法从我的电报机器人向Mysql数据库插入数据,并且总是运行Exception。只有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(应该插入到tanggald的数据)

1 个答案:

答案 0 :(得分:1)

这不是将数据插入表格的正确方法。虽然可能的方式有效,但它不安全且缺少数据转义('"等):

  

许多数据类型的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)

进一步阅读:

  1. MySQL docs and example

  2. Similar article for PostgreSQL(包含对潜在问题的更好解释)