अपडेट में शून्य के साथ काम करना जहां कथन को हार्ड-कोडिंग किए बिना खंड - पायथन, mysql, पायथन-2.7, शून्य, एसक्यूएल-अपडेट

मैं एक ऐसी विधि लिखना चाहता हूं जो एक उत्पन्न करता है update बयान, हार्ड-कोडिंग कॉलम और मूल्यों के बिना। बयान वैकल्पिक शामिल करने जा रहा है where खंड और पारित किया जा रहा है executemany, खंड में केवल कॉलम और मान हैं, कोई भी नहीं है select वहाँ पर। उदाहरण:

update TABLE
set
Col1 = "a",
Col2 = "b",
Col3 = "c"
where
Col4 = "d"
and Col5 = "e"
and Col1 is null;

मैंने अब तक क्या लिखा है:

def update(self, table_name, update_columns, values, where_columns=None, where=True):
update_columns_and_values = self.generator.generateColumnsAndPlaceholders(update_columns)
if where:
where_clause = self.generator.generateWhereClause(where_columns)
else:
where_clause = ""
query = """
update {t}
set
{cv}
{w}
""".format(t=table_name, cv=update_columns_and_values, w=where_clause)
self.cursor.executemany(query, values)
self.connection.commit()

def generateColumnsAndPlaceholders(columns):
if type(columns) is str:
columns = columns.split(", ")
return ", n".join([str(c) + " = " + ""%s"" for c in columns])

अब, मुझे एक फ़ंक्शन कैसे लिखना चाहिए generateWhereClause वह किसी भी संख्या में कॉलम लेता है और वापस लौटता है where प्लेसहोल्डर्स के साथ क्लॉज दोनों एक शून्य मान (संकेत के साथ) के लिए समायोजित नहीं किया गया है =) और एक शून्य मान (के साथ संकेत दिया गया) is null)? इसके अलावा, मुझे लगता है कि स्ट्रिंग द्वारा लौट आए generateColumnsAndPlaceholders के लिए तैयार नहीं है null प्लेसहोल्डर्स के आसपास एकल उद्धरण के कारण। यदि हां, तो मुझे इसे कैसे बदलना चाहिए?

सामान्य तौर पर, मैं कैसे निपटता हूं null हार्ड-कोडिंग विशिष्ट कथन के बिना अपडेट स्टेटमेंट में?

उत्तर:

उत्तर № 1 के लिए 1

फ़ंक्शन जो क्वेरी उत्पन्न करता है - यह स्तंभों के लिए तालिका का नाम, मूल्यों का शब्दकोश लेता है {column: value} और बाधाओं का शब्दकोश, कि बाधा के रूप में कोई भी सम्मान करता है {column: constraint}

def update_query(table_name, values, constraints):
v_list = [k + "=" + """ + v + """ for k, v in values.iteritems()]
v_query = ", ".join(v_list)
c_list = [k + (" IS NULL" if c is None else "=" + """ + c + """) for k, c in constraints.iteritems()]
c_query = " AND ".join(c_list)
return "UPDATE " + table_name + " SET " + v_query + " WHERE " + c_query

टेस्ट कोड:

tn = "table"
vl = {"Col1":"a","Col2":"b","Col3":"c"}
cn = {"Col4":"d","Col5":"e","Col":None}

परिणाम:

UPDATE table SET Col2="b", Col3="c", Col1="a" WHERE Col6 IS NULL AND Col4="d" AND Col5="e"

मुझे उम्मीद है कि आदेश आपके लिए कोई मुद्दा नहीं है।


संबंधित सवाल
सबसे लोकप्रिय