Python使用不同位置的参数更新查询

2024-09-28 03:15:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个简单的脚本来检查用户帐户是否即将过期。我遇到了一个更新查询的问题-它基本上不更新。我在互联网上找到的所有例子似乎都使用元组来更新行,但是我的例子要求参数彼此分开。在

我对Python完全陌生(我从昨天开始的)。我的数据库是MySQL(web上几乎所有的例子都使用SQLite),我不能改变它。我使用Python3,服务器运行在Ubuntu18.04上。我尝试用替换%s?或:变量。我也尝试过不安全的方法(SQL注入易受攻击),但也没用。在

这是我当前的代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import mysql.connector
from mysql.connector import Error
import datetime
try:
    mydb = mysql.connector.connect(
        host="localhost",
        user="rootery-root",
        passwd="example",
        database="playground"
        )

    sqlCursor = mydb.cursor()
    sqlCursor.execute("SELECT id, email, last_email_date FROM users WHERE soon_expires = 1")
    sqlResult = sqlCursor.fetchall()
    setLastMailCmd = """UPDATE users SET last_email_date =%s WHERE id =%s"""
    today = datetime.date.today()

    for i in range(0, len(sqlResult)):
        id = sqlResult[i][0]
        email = sqlResult[i][1]
        lastemaildate = sqlResult[i][2]
        daydiff = lastemaildate - today
        setLastMail = sqlCursor.execute(setLastMailCmd, (id, today))
        if daydiff.days >= 30:
            print "Sending mail and updating \"last_email_date\"."
            setLastMail
        else:
            print "%s already received an e-mail this month - ignored." % email
            setLastMail  # debugging purposes

except mysql.connector.Error as error:
    print("SQL connection error.".format(error))

finally:
    if (mydb.is_connected()):
        sqlCursor.close()
        mydb.close()
        print("Disconnected from database.")
        print(today)

我希望它用for循环提供的数据更新我的表,但是它根本不做任何事情。在


Tags: importidconnectortodaydateemailmysqlerror
1条回答
网友
1楼 · 发布于 2024-09-28 03:15:37

尝试更多地使用函数。你把所有的东西放在一个地方,不容易调试。在

你的问题是你使用setLastMail # debugging purposes的方式。它什么也没做。在

最好是:

mydb = mysql.connector.connect(
    host="localhost",
    user="rootery-root",
    passwd="example",
    database="playground"
)

sqlCursor = mydb.cursor()

def set_last_email(id):
    stmt = """UPDATE users SET last_email_date =%s WHERE id =%s"""
    today = datetime.date.today()
    sqlCursor.execute(stmt, (id, today))

然后执行set_last_email(id)。在

记住要使游标全局化,否则它在函数中不可用。或者直接从全局连接中获取。在

这当然是一个虚拟的例子,但你需要从某个地方开始:)

相关问题 更多 >

    热门问题