Lambda (Python 3.6) PyMySql 查询 EXISTS 查询总是 returns 1
Lambda (Python 3.6) PyMySql Query EXISTS query always returns 1
我正在尝试在 Lambda (Python 3.6) 中获取 PyMySQL 查询以 return 是否存在用户。我将我的 slack 用户 ID 传递到查询中。这就是我要打卡的MySQL。我可以通过 MySQL 运行 相同的查询,它 return 是 0,但出于某种原因,每次我通过 lambda 调用此查询时,它都会告诉我用户存在(我的数据库是空的)。我的查询功能是这样的:
def userExists(user):
statement = f"SELECT EXISTS(SELECT 1 FROM slackDB.Assets WHERE userID LIKE '%{user}%')Assets"
tempBool = cursor.execute(statement, args=None)
conn.commit()
return tempBool
这是我正在使用的完整代码:
################################
# Slack Lambda handler.
################################
import sys
import logging
import os
import pymysql
import urllib
# Grab data from the environment.
BOT_TOKEN = os.environ["BOT_TOKEN"]
ASSET_TABLE = os.environ["ASSET_TABLE"]
REGION_NAME = os.getenv('REGION_NAME', 'us-east-2')
DB_NAME = "admin"
DB_PASSWORD = "somepassword"
DB_DATABASE = "someDB"
RDS_HOST = "myslackdb.somepseudourl.us-east-2.rds.amazonaws.com"
port = 3306
logger = logging.getLogger()
logger.setLevel(logging.INFO)
try:
conn = pymysql.connect(RDS_HOST, user=DB_NAME, passwd=DB_PASSWORD, db=DB_DATABASE, connect_timeout=5)
cursor = conn.cursor()
except:
logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
sys.exit()
# Define the URL of the targeted Slack API resource.
SLACK_URL = "https://slack.com/api/chat.postMessage"
def userExists(user):
statement = f"SELECT EXISTS(SELECT 1 FROM slackDB.Assets WHERE userID LIKE '%{user}%')Assets"
tempBool = cursor.execute(statement, args=None)
conn.commit()
return tempBool
def addUser(user):
statement = f"INSERT INTO `slackDB`.`Assets` (`userID`, `money`) VALUES ('{user}', '1000')"
tempBool = cursor.execute(statement, args=None)
conn.commit()
return tempBool
def lambda_handler(data, context):
# Slack challenge answer.
if "challenge" in data:
return data["challenge"]
# Grab the Slack channel data.
slack_event = data['event']
slack_userID = slack_event["user"]
slack_text = slack_event["text"]
channel_id = slack_event["channel"]
slack_reply = ""
# Ignore bot messages.
if "bot_id" in slack_event:
slack_reply = ""
else:
# Start data sift.
if slack_text.startswith("!networth"):
slack_reply = "Your networth is: "
elif slack_text.startswith("!price"):
command,asset = text.split()
slack_reply = f"The price of a(n) {asset} is: "
elif slack_text.startswith("!addme"):
if userExists(slack_userID):
slack_reply = f"User {slack_userID} already exists"
else:
slack_reply = f"Adding user {slack_userID}"
addUser(slack_userID)
# We need to send back three pieces of information:
data = urllib.parse.urlencode(
(
("token", BOT_TOKEN),
("channel", channel_id),
("text", slack_reply)
)
)
data = data.encode("ascii")
# Construct the HTTP request that will be sent to the Slack API.
request = urllib.request.Request(
SLACK_URL,
data=data,
method="POST"
)
# Add a header mentioning that the text is URL-encoded.
request.add_header(
"Content-Type",
"application/x-www-form-urlencoded"
)
# Fire off the request!
urllib.request.urlopen(request).read()
# Everything went fine.
return "200 OK"
我在 slack 中输入“!addme”,它总是告诉我用户存在。我已经打印出我的查询语句,它正在正确输入我的 slack ID。我检查了我的 table,它完全是空的。我在 MySQL 中有 运行 查询,它 return 是 0。
有人有什么想法吗?我只是在做一些简单的事情吗?非常感谢任何帮助或提示。
谢谢,
我没有从光标中看到 fetch
。只是 execute
.
execute
中的 return 是受影响的行数。对于有意义的 DML 操作 (INSERT/UPDATE/DELETE)。但我不会依赖受影响的行数来计算 SELECT.
在这种情况下,SELECT EXISTS
查询要么 return 一行,要么抛出错误。但是查询 returns a row 的事实并没有告诉我们任何关于 Assets
列的值的信息。
从查询来看,我们似乎想要获取一行,然后确定 Assets
列是否包含 0 或 1(或 NULL)。
查询执行后,尝试cur.fetchone
检索行。
我们还可以执行一个更简单的查询,然后使用提取来确定某行是否 returned。
我正在尝试在 Lambda (Python 3.6) 中获取 PyMySQL 查询以 return 是否存在用户。我将我的 slack 用户 ID 传递到查询中。这就是我要打卡的MySQL。我可以通过 MySQL 运行 相同的查询,它 return 是 0,但出于某种原因,每次我通过 lambda 调用此查询时,它都会告诉我用户存在(我的数据库是空的)。我的查询功能是这样的:
def userExists(user):
statement = f"SELECT EXISTS(SELECT 1 FROM slackDB.Assets WHERE userID LIKE '%{user}%')Assets"
tempBool = cursor.execute(statement, args=None)
conn.commit()
return tempBool
这是我正在使用的完整代码:
################################
# Slack Lambda handler.
################################
import sys
import logging
import os
import pymysql
import urllib
# Grab data from the environment.
BOT_TOKEN = os.environ["BOT_TOKEN"]
ASSET_TABLE = os.environ["ASSET_TABLE"]
REGION_NAME = os.getenv('REGION_NAME', 'us-east-2')
DB_NAME = "admin"
DB_PASSWORD = "somepassword"
DB_DATABASE = "someDB"
RDS_HOST = "myslackdb.somepseudourl.us-east-2.rds.amazonaws.com"
port = 3306
logger = logging.getLogger()
logger.setLevel(logging.INFO)
try:
conn = pymysql.connect(RDS_HOST, user=DB_NAME, passwd=DB_PASSWORD, db=DB_DATABASE, connect_timeout=5)
cursor = conn.cursor()
except:
logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
sys.exit()
# Define the URL of the targeted Slack API resource.
SLACK_URL = "https://slack.com/api/chat.postMessage"
def userExists(user):
statement = f"SELECT EXISTS(SELECT 1 FROM slackDB.Assets WHERE userID LIKE '%{user}%')Assets"
tempBool = cursor.execute(statement, args=None)
conn.commit()
return tempBool
def addUser(user):
statement = f"INSERT INTO `slackDB`.`Assets` (`userID`, `money`) VALUES ('{user}', '1000')"
tempBool = cursor.execute(statement, args=None)
conn.commit()
return tempBool
def lambda_handler(data, context):
# Slack challenge answer.
if "challenge" in data:
return data["challenge"]
# Grab the Slack channel data.
slack_event = data['event']
slack_userID = slack_event["user"]
slack_text = slack_event["text"]
channel_id = slack_event["channel"]
slack_reply = ""
# Ignore bot messages.
if "bot_id" in slack_event:
slack_reply = ""
else:
# Start data sift.
if slack_text.startswith("!networth"):
slack_reply = "Your networth is: "
elif slack_text.startswith("!price"):
command,asset = text.split()
slack_reply = f"The price of a(n) {asset} is: "
elif slack_text.startswith("!addme"):
if userExists(slack_userID):
slack_reply = f"User {slack_userID} already exists"
else:
slack_reply = f"Adding user {slack_userID}"
addUser(slack_userID)
# We need to send back three pieces of information:
data = urllib.parse.urlencode(
(
("token", BOT_TOKEN),
("channel", channel_id),
("text", slack_reply)
)
)
data = data.encode("ascii")
# Construct the HTTP request that will be sent to the Slack API.
request = urllib.request.Request(
SLACK_URL,
data=data,
method="POST"
)
# Add a header mentioning that the text is URL-encoded.
request.add_header(
"Content-Type",
"application/x-www-form-urlencoded"
)
# Fire off the request!
urllib.request.urlopen(request).read()
# Everything went fine.
return "200 OK"
我在 slack 中输入“!addme”,它总是告诉我用户存在。我已经打印出我的查询语句,它正在正确输入我的 slack ID。我检查了我的 table,它完全是空的。我在 MySQL 中有 运行 查询,它 return 是 0。
有人有什么想法吗?我只是在做一些简单的事情吗?非常感谢任何帮助或提示。
谢谢,
我没有从光标中看到 fetch
。只是 execute
.
execute
中的 return 是受影响的行数。对于有意义的 DML 操作 (INSERT/UPDATE/DELETE)。但我不会依赖受影响的行数来计算 SELECT.
在这种情况下,SELECT EXISTS
查询要么 return 一行,要么抛出错误。但是查询 returns a row 的事实并没有告诉我们任何关于 Assets
列的值的信息。
从查询来看,我们似乎想要获取一行,然后确定 Assets
列是否包含 0 或 1(或 NULL)。
查询执行后,尝试cur.fetchone
检索行。
我们还可以执行一个更简单的查询,然后使用提取来确定某行是否 returned。