将变量和函数存储在字典中,这是正确的方法吗?

问题描述 投票:0回答:2

我是Python的新手,并试图让我的头脑创建一个case语句等效,它将存储我想从字典中拉出然后执行的sql字符串。问题是sql语句本身将包含变量/函数(实际上它们是动态sql语句)。我已经阅读了无数关于dict或if..else是否是实现我想要在Python中实现的最佳方式的评论。

这是我的起始代码,它不会返回我想要的内容

def my_switch(action,user,role):
switcher = {
    "CR": "CREATE USER user PASSWORD genpass()",
    "DR": "DROP USER user",
    "GR": "GRANT ROLE role TO user",
    "RV": "REVOKE ROLE role FROM user",
    "PW": "ALTER USER user PASSWORD genpass()"
}
    logger.debug("Command passed was %s,user passed was %s, role passed was %s",action,user,role)
print switcher.get(action, "Invalid command")

my_switch(cmd,user,role)

通过CR时输出,例如bloggsj,APP

CREATE USER user PASSWORD genpass()

当我希望它回来时

CREATE USER bloggsj PASSWORD somegeneratedpw

如何让它将用户识别为变量并执行genpass()函数?

python database
2个回答
0
投票

假设你使用pymssql,你可以这样做:

switcher = {
    "CR": "CREATE USER %(user)s PASSWORD %(password)s",
    "DR": "DROP USER %(user)s",
    "GR": "GRANT ROLE %(role)s TO %(user)s",
    "RV": "REVOKE ROLE %(role)s FROM %(user)s",
    "PW": "ALTER USER %(user)s PASSWORD %(password)s"
}

def execute_action(cursor, action, **params):
    try:
        raw_sql = switcher[action]
    except KeyError:
        raise ValueError('Invalid command') # do something with the error
    print('SQL command preview:', raw_sql % params)
    cursor.execute(raw_sql, params)

conn = pymssql.connect(...)
cursor = conn.cursor()
execute_action(cursor, 'CR', user='my_username', password=genpass())
conn.commit()

简而言之:准备switcher,其中实际参数被占位符替换(pymssql使用syntax similar to Python's) - 无需每次在函数中创建它。然后,收集作为keyword arguments传递的参数,让图书馆的名字与名字相匹配并逃避任何危险的事情。

请注意,执行命令之前print()的输出不一定与发送到数据库的实际查询匹配,仅用于说明目的。


-1
投票
def my_switch(action,user,role):
    temp_action = action
    temp_user=user
    temp_role=role
    switcher = {
             "CR": "CREATE USER user PASSWORD genpass()",
             "DR": "DROP USER user",
             "GR": "GRANT ROLE role TO user",
             "RV": "REVOKE ROLE role FROM user",
             "PW": "ALTER USER user PASSWORD genpass()"
               }
    logger.debug("Command passed was %s,user passed was %s, role passed was %s",temp_action,temp_user,temp_role)
    print switcher.get(temp_action, "Invalid command")

my_switch(cmd,user,role)

现在在temp_action,temp_user和temp_role中,您的数据将被保存。您可以随时随地使用。但我会建议你,如果你想在不同的函数中再次重复使用相同的变量,只需去上课。试试这个,如果你遇到任何问题,请告诉我。享受编码:)

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.