在linux中输入cntrl+c关闭python文件之前,不会将表值插入mysql数据库

2024-04-26 09:37:44 发布

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

编辑

Q)有人能帮我把值插入mysql数据库吗,只是搞不清楚mydb函数放在哪里

原因:一旦我手动输入cntrl+cfor.py,那么只有值被插入mysql数据库

在.py文件中使用

下面是完整的代码,我应该把mydb函数放在哪里?你知道吗

在linux中输入cntrl+c关闭python文件之前,不会将表值插入mysql数据库

import os
import re
from builtins import len, Exception
import slack
import logging
from subprocess import check_output
import datetime
import mysql.connector
import time
import json
import requests

#user_threads_info = {}
#thread_ts = ""

@slack.RTMClient.run_on(event='message')
def say_hello(**payload):
    try:
        ##0 get clients and payload
        logging.info('msg received')
        data = payload['data']
        web_client = payload['web_client']
        rtm_client = payload['rtm_client']
        ##0 - 1 Check if it is the first msg, not replied msg by me
        # print(data)
        if data.get('text') == None:
            logging.info('This msg is my replied msg.')
            return False
        ##0-2 Get channel info
        channel_id = data['channel']
        thread_ts = data['ts']

        global user
        user = data['user']
        #user_info = get_userinfo(user)
        #print(user_info)


        msg = data['text']





        ##1 get scenario submsg
        retVal = analysis_msg(msg)
        # print(retVal)

        response = web_client.users_list()
        assert(response['ok'])
        user_map = {x['id']: x['name'] for x in response['members']}
        global user_name
        user_name = user_map[user] if user in user_map else None
        print(user_name)

        if retVal[0] == False:

            retMsg = retVal[1] + "\nI can create the following orders. \n" \
                                 "a) spu - store pickup \n" \
                                 "b) sth - ship to home \n" \
                                 "c) del - delivery \n" \
                                 "d) digitalAsGuest - Digital item \n" \
                                 " \n" \
                                 "Please provide information as mentioned in below example.\n" \
                                 " \n" \
                                 "Example: spu:3646989:sftqa3:AMEX\n" \
                                 "\n" \
                                 "Sample SKUS:\n" \
                                 "spu - [3646989,8862011]\n" \
                                 "sth - [2592015,6140094]\n" \
                                 "del - [5592005,8862011]\n" \
                                 "digitalAsGuest - [2810037,5057400]"

            send_msg(web_client, channel_id, thread_ts, user, retMsg)

            return False

        ##2 form cmd
        retVal = form_cmd(retVal[1])
        print(retVal)
        if retVal == False:
            return False

        ##3 execute cmd
        # inform the start of test
        retMsg = "Creating an order,Please wait for the result."
        send_msg(web_client, channel_id, thread_ts, user, retMsg)




        global res
        try:
            res1 = os.popen(retVal).read()
            print("Printing result...")
            print(res1)
            print("end of print")
            res = reg_result_new(res1)
            if res == False:
                print("reg_function failure")
                retMsg = "The test order placement failed."
            else:
              retMsg = "Order Id - " + res['id'] + "\nFirst Name - " + res['firstName'] + "\nLast Name - " + res['lastName'] + "\n PhoneNumber - " + res['dayPhoneNumber'] + "\n Email - " + res['email'] + "\n"

        except Exception as ee:
            retMsg = "The test scenario has a failure. Please Check the feature file."

            ## 4 send result to slack
            # retMsg = "Order Id - " + res['id'] + "\nFirst Name - " + res['firstName'] + "\nLast Name - " + res['lastName'] + "\n PhoneNumber - " + res['day                        PhoneNumber'] + "\n Email - " + res['email'] + "\n"
        create_result_file(user, res)
        send_msg(web_client, channel_id, thread_ts, user, retMsg)
        print(retVal)

    except Exception as e:
        print("error")
        logging.critical(str(e))


############################    My handlers     ##############################
def create_result_file(user, res):
    try:
        cur_time = datetime.datetime.now()
        file_name = user + str(cur_time.year) + str(cur_time.month) + str(cur_time.day) + str(cur_time.hour) + str(
            cur_time.minute) + str(cur_time.second) + '.txt'
        file = open(file_name, 'w')
        file.write(res)
        file.close()
    except Exception as e:
        print(str(e))


def send_msg(web_client, channel_id, thread_ts,user,mgs):
     print("thread_ts value is:"+thread_ts)
     web_client.chat_postMessage(
        channel=channel_id,
        text=f"```Hi <@{user}>! \n " + mgs + "```",
        thread_ts=thread_ts

    )




#def get_userinfo(user):
#      payload = {'token': slack_token, 'user': user}
#      r = requests.get('https://slack.com/api/users.info', params=payload)
#      print(r.text)
#      return json.loads(r.text)["user"]
# error code mgmt.
def error_code(code):
    # reserved
      print(code)
      return [False, code]


# break down msg to the test scenario submsgs
def analysis_msg(msg):


    global submsg

    submsg = msg.split(":")
    for value in submsg:
       print(value)
    if len(submsg) != 4:
        logging.warning("This msg not test scenario")
        return error_code("Please check the format")
    res = {}
    res["feature"] = submsg[0]
    res["sku"] = submsg[1]
    res["env"] = submsg[2]
    res["payment"] = submsg[3]



    ###check
    if validate_sku(res["sku"]) == False:
        return error_code("INVALID_SKU \n")

    if validate_env(res["env"]) == False:
        return error_code("INVALID_ENV \n")

    if validate_payment(res["payment"]) == False:
        return error_code("INVALID_payment \n")

    if check_specialCharacter(res["feature"]) == False:
        return error_code("INVALID_PROFILE_WITH_SPECIAL_CHARACTER")

    return [True, res]


# form cmd for test bat files    !   reserved

def form_cmd(submsg):
    cmd = 'sh /home/iptbot/iptautobot/test.sh ' + submsg['env'] + ' ' + submsg['feature'] + ' ' + submsg["sku"] + ' ' + submsg["payment"]
    return cmd

#code to print user details

#code to print user details

def reg_result_new(res):
    start = 'COP Order Response :'
    end = 'isGuestMode'
    start_index = res.find(start) + len(start)
    res = res[start_index:]
    end_index = res.find(end) + 22
    global data
    data = res[:end_index]
    try:
        print('Data -> ' + str(data))
        data = json.loads(data.strip())
        new_data = {}
        new_data['id'] = data['id']
        new_data['firstName'] = data['lineItems'][0]['fulfillmentInfo']['storeInfo']['agentInfo']['firstName']
        new_data['lastName'] = data['lineItems'][0]['fulfillmentInfo']['storeInfo']['agentInfo']['lastName']
        new_data['dayPhoneNumber'] = data['lineItems'][0]['fulfillmentInfo']['storeInfo']['agentInfo']['dayPhoneNumber']
        new_data['email'] = data['lineItems'][0]['fulfillmentInfo']['storeInfo']['agentInfo']['email']

        #new_data['firstName'] = data['paymentInfo']['billingAddressInfo']['firstName']

        return new_data
    except Exception as e:
        print('Here error -> '+str(e))
        return False


#def reg_result(res):
    # "COP Order Response"
#    lines = res.split('\n')
#    for line in lines:
#       pattern = "COP Order Response*"
#       prog = re.compile(pattern)
#       result = prog.search(line)
#       if result == None:
#            continue
#       res1 = result.string.split('{')
#       if len(res1) < 2:
#            continue
#       res2 = res1[1].split(',')
#       if len(res2) < 2:
#           continue
#       res3 = res2[0].split(':')
#       if len(res3) < 2:
#           continue
#       return res3[1]
        # COP Order Response : {"id":"BBY01-200001878853"
#   return False
# return val is Boolean
# True/False
# Input type: String
# for positive integer only
# alternative way: Handle exception for int(d)

def validate_sku(sku_val):
    return sku_val.isnumeric()
# input val : string
# return val: Boolean
def validate_env(env_val):
    env_list = [
        "sftqa1" , "sftqa2" , "sftqa3" , "sftqa4"
    ]

    if env_val in env_list:
        return True
    else:
        return False

def validate_payment(payment_val):
        env_payment = [
            "AMEX","VISA"
        ]
        if payment_val in env_payment:
            return True
        else:
            return False

# input val : string
# return val: Boolean

def check_specialCharacter(s):
  if s == "":
    return False
  if s.isspace():
    return False
  return s.isalnum()


slack_token = os.environ["SLACK_API_TOKEN"]
rtm_client = slack.RTMClient(token=slack_token)
rtm_client.start()

#database connction
mydb = mysql.connector.connect(
host="host",
user="user",
passwd="pass",
database="db"
)
mycursor = mydb.cursor()
for value in submsg:
  print(value)
fulfilment=submsg[0]
sku=submsg[1]
environment=submsg[2]
payment=submsg[3]
ts = time.time()
date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
orderNumber=data['id']
username=user_name

print(fulfilment)
print(sku)
print(environment)
print(payment)
print(username)
print(orderNumber)

sqlformula = "INSERT INTO orderDetails (fulfilment,sku,environment,payment,orderNumber,date,user) VALUES (%s,%s,%s,%s,%s,%s,%s)"

#order=("sth",3643387,"sftqa2","AMEX")
#mycursor.execute(sqlformula,order)

mycursor.execute(sqlformula,(fulfilment,sku,environment,payment,orderNumber,date,username))


mydb.commit()
mydb.close()


输出

1 sh /home/iptbot/iptautobot/test.sh sftqa3 spu 3646989 AMEX
2 error
3 CRITICAL:root:'user'
4 error
5 CRITICAL:root:'user'                // clicking Control+C values get inserted 
6 ^CWARNING:slack.rtm.client:Websocket was closed.  
7 3646989
8 sftqa3
9 AMEX
10 spu
11 3646989
12 sftqa3
13 AMEX
14 a6002043
15 BBY01-200002091354




Tags: clientidfalsedatareturnifdefcode
1条回答
网友
1楼 · 发布于 2024-04-26 09:37:44

因为rtm_client.start()是一个同步调用,所以您在这一点上陷入了困境。你知道吗

如果您希望它是异步的(非阻塞的),那么您应该运行:

rtm_client.start(run_async=True) 

这里是关于如何设置库的async用法的详细介绍。还可以查看RTMClient的方法签名,了解其工作原理。你知道吗

这里有一个很好的example详细介绍了您的案例中需要的很多内容。你知道吗

然后您将点击您的db执行代码,在那里您将需要有一个while循环来遍历您想要添加到db中的数据。你知道吗

我建议您为此使用Queue,因为它是同步的,并且比在每个订单上覆盖的全局列表更易于管理。最好您可以将asyncio.Queue与实现here的示例一起使用

当订单通过验证步骤后,将其添加到队列中。下面是一些用基本(非异步)队列描述流的伪代码:

import queue

q = queue.Queue()

def validate_order(order):
    valid_order_data = ......
    q.put(valid_order_data)

while True:
    valid_order = q.get()  # Will wait until there is a value on the queue
    mycursor.execute(sqlformula, (valid_order))

相关问题 更多 >