MySQL字符串中Python参数格式化值

2024-09-30 04:38:57 发布

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

在Python中,我将两个变量传递给MySQL,第二个变量被引用为{0},并且工作正常。在

如何使第一个参数执行相同的操作?如果{0}是第二个变量。第一个是什么?dbname不正确,我需要在此字符串中显示{}的值?在

def checkTableExists(dbname,tablename):
    sql2 = """SELECT COUNT(*) FROM information_schema.tables
        WHERE table_schema = " dbname "
        AND table_name = '{0}' """.format(tablename.replace('\'', '\'\''))

Tags: 字符串fromtables参数informationschemadefcount
1条回答
网友
1楼 · 发布于 2024-09-30 04:38:57

组织函数以创建查询的更好方法可能是:

def checkTableExists(dbname, tablename):
    query_args = {"table_name":tablename, "database_name":dbname}
    exist_query = """
        SELECT EXISTS (
            SELECT * 
            FROM INFORMATION_SCHEMA.TABLES 
            WHERE TABLE_NAME = '%(table_name)s' 
            AND TABLE_SCHEMA = '%(database_name)s') AS `Exist`
        """%(query_args)

    # Do stuff with the `Exist` column of whatever your db connection returns.
    # Should be 1 if True. Might be good to just return bool(...).

这就是EXISTS的用途,因此您不需要进行“黑客”并检查INFORMATION_SCHEMA.TABLES中的COUNT是否大于0。在

正如@jgranger在OP中评论的那样,如果您使用MySQLdb,那么可以跟踪该链接并让它进行参数替换。但是与pyodbc的交互还有许多其他风格,因此字符串格式的查询永远不会消失(我希望它们会消失)。在

甚至更好

用SQL编写一个存储过程,检查表是否作为数据库名和模式名的函数存在,然后只向该存储过程传递参数。然后系统的任何组件(Python或其他组件)都可以期望该存储过程的接口进行存在性检查。在

如果存在性检查逻辑需要改变(比如在您的应用程序中,一个表的行数超过0行,而不仅仅是使用CREATE TABLE命令创建的,反之亦然),然后,您就可以更改存储过程的内部结构,而不必去每个具有嵌入式字符串SQL查询的下游位置并更改逻辑。它有助于为系统与数据库的交互添加模块化和封装。在

相关问题 更多 >

    热门问题