mySQL 从浏览器调用 UPDATE 对 GAE 不起作用

mySQL UPDATE doesn't work for GAE when called from browser

我正在为 Google App Engine 编写验证电子邮件地址 python 文件。 (是的,我知道 django 有东西,但我想自己写,因为那是我学习的方式)

下面是 python 代码。代码 returns "Email Account Verified" 在我看来查询有效。但是,当我查看数据库中的 "active" 列时,它仍然是 0.

如果我在数据库本身中运行 logging.info("%s",db_query) 的查询字符串,它会工作并更新为 1。

我的所有其他 python 代码(带有更新)工作正常,唯一的区别是那些 python 文件是从我的 ios 应用程序调用的,而这个是从浏览器调用的.

#Make the libs folder with 3rd party libraries and common methods
import sys
sys.path.insert(0, 'libs')

#Imports
import logging
import webapp2
from django.utils.html import strip_tags
import common
import MySQLdb
import json

VERIFIED_HTML = """\
<html>
  <body>
    <h1>Email Account Verified</h1>
  </body>
</html>
"""

ERROR_HTML = """\
<html>
  <body>
    <h1>ERROR</h1>
  </body>
</html>
"""


class VerifyEmail(webapp2.RequestHandler):
    def get(self):
        user_email = strip_tags(self.request.get('user_email').lower().strip())
        user_activation_hash = strip_tags(self.request.get('user_activation_hash').strip())

        logging.info("User Email = %s", user_email)
        logging.info("User Activation Hash = %s", user_activation_hash)

        #Insert the information into the users table
        #Get the database connection to Google Cloud SQL
        db = common.connect_to_google_cloud_sql()
        db_cursor = db.cursor(MySQLdb.cursors.DictCursor)

        #Check to see if user already exists
        #Query for user
        db_query = """SELECT \
                      email, activation_hash \
                      FROM users WHERE email='%s' AND activation_hash='%s'""" %          (user_email, user_activation_hash)
    db_cursor.execute(db_query)

        #If there is one record containing the username check password
        if(db_cursor.rowcount == 1):
            db_query = """UPDATE users SET active=%s WHERE email='%s';""" % (1, user_email)
            logging.info("%s" % db_query)
            if(db_cursor.execute(db_query)):
                self.response.write(VERIFIED_HTML)
            else:
                self.response.write(ERROR_HTML)

        else: #either no user, or activation_hash doesn't match
            self.response.write(ERROR_HTML)

连接到 Google 云 SQL

def connect_to_google_cloud_sql():
    #hostname = DEV_DB_HOSTNAME
    #hostname = PROD_DB_HOSTNAME

    db_username = 'dummy_user' #not real
    db_password = 'dummypassword' # not real


    #If PROD or Deployed Testing, use unix_socket
    if(os.getenv('SERVER_SOFTWARE') and os.getenv('SERVER_SOFTWARE').startswith('Google App Engine/')):
      db = MySQLdb.connect(unix_socket='/cloudsql/' + _DATABASE_HOSTNAME, db='dummydbname', user=db_username, passwd=db_password)
    else: #Local Testing uses host
      db = MySQLdb.connect(host=_DATABASE_HOSTNAME, port=3306, db='dummydbname', user=db_username, passwd=db_password)

    logging.info("Got DB Connection")

    return db

有什么建议吗?是GAE Cloud SQL 权限吗???? 可能是因为我在浏览器中使用了在本地 ip 上运行的本地应用程序引擎???

您需要在执行查询后对 MySQLdb 游标调用 .commit()。这就是您的更新失败的原因。它在事务内部进行更新,但是当您的代码在未提交事务的情况下结束时,对数据库的更改将回滚,尽管已告知用户更新成功。

您还可以使用以下方法在使用游标时确保提交:db_cursor.autocommit(True).