PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

अजगर के साथ एसक्यूएल स्टेटमेंट जेनरेट करें

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं अक्सर वही चाहता हूं जो ऐसा लगता है कि ओपी चाहता है:बुनियादी एसक्यूएल उत्पन्न करने के लिए एक बहुत ही सरल पुस्तकालय।

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. रेल + पोस्टग्रेएसक्यूएल - लाइक का उपयोग करना

  2. मैं एक बाइनरी pgdump (संपीड़ित) को एक सादे SQL फ़ाइल में कैसे परिवर्तित करूं?

  3. PostgreSQL को तैनात करने के लिए Kubernetes का उपयोग करना

  4. SQL क्वेरी:किसी तालिका से आदेशित पंक्तियाँ प्राप्त करें

  5. मैं इस पोस्टग्रेज क्वेरी को अमेज़ॅन रेडशिफ्ट में कैसे लिख सकता हूं जैसे कि यह पोस्टग्रेज में जितना अनुकूलित था?