我知道这是一个老问题,但我经常想要OP想要的东西:一个用于生成基本SQL的非常简单的库。
下面的函数就是这样做的。给它们一个表名和一个包含要使用的数据的字典,它们返回所需操作的SQL查询。
键/值对表示数据库行中的字段名和值。def read(table, **kwargs):
""" Generates SQL for a SELECT statement matching the kwargs passed. """
sql = list()
sql.append("SELECT * FROM %s " % table)
if kwargs:
sql.append("WHERE " + " AND ".join("%s = '%s'" % (k, v) for k, v in kwargs.iteritems()))
sql.append(";")
return "".join(sql)
def upsert(table, **kwargs):
""" update/insert rows into objects table (update if the row already exists)
given the key-value pairs in kwargs """
keys = ["%s" % k for k in kwargs]
values = ["'%s'" % v for v in kwargs.values()]
sql = list()
sql.append("INSERT INTO %s (" % table)
sql.append(", ".join(keys))
sql.append(") VALUES (")
sql.append(", ".join(values))
sql.append(") ON DUPLICATE KEY UPDATE ")
sql.append(", ".join("%s = '%s'" % (k, v) for k, v in kwargs.iteritems()))
sql.append(";")
return "".join(sql)
def delete(table, **kwargs):
""" deletes rows from table where **kwargs match """
sql = list()
sql.append("DELETE FROM %s " % table)
sql.append("WHERE " + " AND ".join("%s = '%s'" % (k, v) for k, v in kwargs.iteritems()))
sql.append(";")
return "".join(sql)
你就这么用。只要给它一个表名和一个字典(或者使用python的**kwargs特性):>>> upsert("tbl", LogID=500, LoggedValue=5)
"INSERT INTO tbl (LogID, LoggedValue) VALUES ('500', '5') ON DUPLICATE KEY UPDATE LogID = '500', LoggedValue = '5';"
>>> read("tbl", **{"username": "morten"})
"SELECT * FROM tbl WHERE username = 'morten';"
>>> read("tbl", **{"user_type": 1, "user_group": "admin"})
"SELECT * FROM tbl WHERE user_type = '1' AND user_group = 'admin';"
但要小心SQL注入攻击
看看当代码的恶意用户执行此操作时会发生什么:>>> read("tbl", **{"user_group": "admin'; DROP TABLE tbl; --"})
"SELECT * FROM tbl WHERE user_group = 'admin'; DROP TABLE tbl; --';"
制作自己的临时ORM很容易,但你只能得到你看到的东西——你必须自己逃避输入:)