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

时间:2013-11-07 20:20:09

标签: python string formatting

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

如何让第一个参数做同样的事情?如果'{0}'是第二个变量。什么是第一个? dbname不正确,我需要在此字符串中显示dbname的值吗?

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

1 个答案:

答案 0 :(得分:0)

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

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的用途,因此您无需执行“hack”并检查COUNT INFORMATION_SCHEMA.TABLES内的CREATE TABLE是否大于0。

正如@jgranger对OP的评论,如果您使用的是MySQLdb,您可以关注该链接并让它进行参数替换。但是与pyodbc有很多其他的交互方式,所以字符串格式的查询永远不会消失(我希望它们会消失)。

更好

在SQL中编写存储过程,检查表是否作为数据库名称和模式名称的函数存在,然后不执行任何操作,只是将参数传递给此存储过程。然后系统的任何组件(Python或其他)都可以期望存储过程的接口进行存在检查。

如果存在检查逻辑需要改变(比如在你的应用程序中突然重要的是一个表有超过0行,而不仅仅是用{{1}}命令创建,反之亦然),那么你可以更改存储过程的内部,而无需转到具有嵌入式字符串SQL查询的每个下游位置并更改逻辑。它有助于为系统与数据库的交互添加模块化和封装。