在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(''', ''''))
组织函数以创建查询的更好方法可能是:
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 查询的每个下游位置并更改逻辑。它有助于为系统与数据库的交互添加模块化和封装性。