【问题标题】:Losing microseconds when inserting date to database将日期插入数据库时​​丢失微秒
【发布时间】:2022-01-22 19:31:03
【问题描述】:

我在视图中有这个代码sn-p:

time_from = datetime.strptime(req.POST['time_from'], "%Y-%m-%d %H:%M:%S.%f")

with connections["mssql_database"].cursor() as cursor:
                sql_statement = "EXEC SaveActivity @TimeFrom='%s'" % (time_from)
                print(sql_statement)
                cursor.execute(sql_statement)

它打印这个SQL 声明:

EXEC SaveActivity @TimeFrom='2021-12-01 08:34:54'

缺少微秒。它们是零,但我需要它们在数据库中。我该如何纠正这个问题?

【问题讨论】:

    标签: python django datetime pyodbc django-database


    【解决方案1】:

    不要执行字符串格式化。将数据作为参数传递。通过使用字符串格式,它将使用str(…),这是一个不太精确的日期时间。使用:

    with connections["mssql_database"].cursor() as cursor:
        sql_statement = "EXEC SaveActivity @TimeFrom='%s'"
        cursor.execute(sql_statement, (time_from,))

    在字符串插值上使用参数不仅可以更好地防止数据丢失,还可以防止 SQL 注入可能通过的地方,例如通过字符串,SQL 查询随后将修改或泄漏数据库。

    【讨论】:

    • 谢谢。我还没有测试。我已经根据你重写了它,但现在我有错误ql = sql % tuple('?' * len(params)) TypeError: %d format: a number is required, not str实际上我有多个参数。我可以出于调试目的打印 sql_statement 吗?
    • @xralf:如果你有多个参数,你需要将这些都添加到第二个2元组中,并使用%s,而不是%d
    • 我知道,但是我有这么多参数,很难看,所以我想打印sql语句,如果可能的话。
    • @xralf:您可以使用connections['mssql_database'].queries 对这些进行 rpint,例如最后一个使用connections['mssql_database'].queries[-1] 进行处理,但关键是参数没有插入到查询本身中.这是为了保护查询免受 SQL 注入。
    • 我试过你的查询,但日期时间根本没有转换。我使用了try..except,之后使用了connections['mssql_database'].queries[-1],它写了{'sql': "QUERY = 'EXEC [dbVyroba].[dbo].[UlozitCinnost] @idpracoviste=%s, @OsobniCislo=%s, @IDcinnost=%s, @idklient=%s ,@pocet=%s, @program=%s, @CasOd=%s, @CasDO=%s, @IdOd=%s' - PARAMS = (1, '0711', 6, 3, 200, 0, datetime.datetime(2021, 12, 1, 8, 34, 54), datetime.datetime(2021, 12, 2, 22, 28), 0)", 'time': '0.045'}
    猜你喜欢
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 2013-01-26
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多