मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं अक्सर वही चाहता हूं जो ऐसा लगता है कि ओपी चाहता है:बुनियादी एसक्यूएल उत्पन्न करने के लिए एक बहुत ही सरल पुस्तकालय।
नीचे दिए गए कार्य बस यही करते हैं। आप उन्हें एक टेबल नाम और एक डिक्शनरी देते हैं जिसमें वह डेटा होता है जिसका आप उपयोग करना चाहते हैं और वे आपके लिए आवश्यक ऑपरेशन के लिए 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)
आप इसे ऐसे ही इस्तेमाल करें। बस इसे एक टेबल नाम और एक शब्दकोश दें (या अजगर की **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 बनाना आसान है लेकिन आपको वही मिलता है जो आप देखते हैं -- आपको इनपुट से खुद बचना होगा :)