Python 在不同的地方使用参数更新查询

Python UPDATE query with parameters in different places

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

我是 Python 的新手(我从昨天开始)。我的数据库是 MySQL(网络上几乎所有示例都使用 SQLite),我无法更改它。我使用 Python 3,服务器是 Ubuntu 18.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 循环提供的数据更新我的 table,但是它什么也没做。

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

你的问题是你使用的方式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)

记得将游标设为全局,否则它在您的函数中将不可用。或者直接在你的函数中从全局连接获取它。

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