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

डुप्लिकेट कुंजी अद्यतन पर SQLAlchemy

डुप्लिकेट कुंजी अद्यतन पर MySQL के लिए संस्करण-1.2 पोस्ट करें

यह कार्यक्षमता अब केवल MySQL के लिए SQLAlchemy में निर्मित है। नीचे दिए गए somada141 के उत्तर का सबसे अच्छा समाधान है:https://stackoverflow.com/a/48373874/319066

डुप्लिकेट कुंजी अद्यतन पर SQL कथन में

यदि आप चाहते हैं कि जनरेट किया गया SQL वास्तव में ON DUPLICATE KEY UPDATE . को शामिल करे , सबसे सरल तरीके में @compiles . का उपयोग करना शामिल है डेकोरेटर।

कोड (रेडिट पर विषय पर एक अच्छे सूत्र से जुड़ा है ) उदाहरण के लिए github पर पाया जा सकता है :

from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql.expression import Insert

@compiles(Insert)
def append_string(insert, compiler, **kw):
    s = compiler.visit_insert(insert, **kw)
    if 'append_string' in insert.kwargs:
        return s + " " + insert.kwargs['append_string']
    return s


my_connection.execute(my_table.insert(append_string = 'ON DUPLICATE KEY UPDATE foo=foo'), my_values)

लेकिन ध्यान दें कि इस दृष्टिकोण में, आपको मैन्युअल रूप से append_string बनाना होगा। आप शायद एपेंड_स्ट्रिंग फ़ंक्शन को बदल सकते हैं ताकि यह स्वचालित रूप से 'ऑन डिप्लिकेट कुंजी अपडेट' स्ट्रिंग के साथ इंसर्ट स्ट्रिंग को एक इंसर्ट में बदल दे, लेकिन मैं आलस्य के कारण यहां ऐसा नहीं करने जा रहा हूं।

डुप्लिकेट कुंजी अद्यतन पर ओआरएम के भीतर कार्यक्षमता

SQLAlchemy ON DUPLICATE KEY UPDATE के लिए एक इंटरफ़ेस प्रदान नहीं करता है या मर्ज करें या इसकी ओआरएम परत में कोई अन्य समान कार्यक्षमता। फिर भी, इसमें session.merge() फ़ंक्शन जो कार्यक्षमता को दोहरा सकता है केवल यदि विचाराधीन कुंजी प्राथमिक कुंजी है

session.merge(ModelObject) SELECT . भेजकर पहले जांचता है कि समान प्राथमिक कुंजी मान वाली कोई पंक्ति मौजूद है या नहीं query (या इसे स्थानीय रूप से देखकर)। यदि ऐसा होता है, तो यह कहीं एक ध्वज सेट करता है जो दर्शाता है कि ModelObject पहले से ही डेटाबेस में है, और SQLAlchemy को UPDATE का उपयोग करना चाहिए सवाल। ध्यान दें कि मर्ज इससे थोड़ा अधिक जटिल है, लेकिन यह प्राथमिक कुंजियों के साथ कार्यक्षमता को अच्छी तरह से दोहराता है।

लेकिन क्या होगा यदि आप डुप्लिकेट कुंजी अद्यतन पर . चाहते हैं गैर-प्राथमिक कुंजी के साथ कार्यक्षमता (उदाहरण के लिए, एक और अनूठी कुंजी)? दुर्भाग्य से, SQLAlchemy में ऐसा कोई कार्य नहीं है। इसके बजाय, आपको कुछ ऐसा बनाना होगा जो Django के get_or_create() . जैसा हो . एक अन्य StackOverflow उत्तर में इसे शामिल किया गया है , और मैं सुविधा के लिए इसका एक संशोधित, कार्यशील संस्करण यहाँ पेस्ट करूँगा।

def get_or_create(session, model, defaults=None, **kwargs):
    instance = session.query(model).filter_by(**kwargs).first()
    if instance:
        return instance
    else:
        params = dict((k, v) for k, v in kwargs.iteritems() if not isinstance(v, ClauseElement))
        if defaults:
            params.update(defaults)
        instance = model(**params)
        return instance


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL में नाम utf8 सेट करें?

  2. MySQL में नया उपयोगकर्ता बनाएं और इसे एक डेटाबेस तक पूर्ण पहुंच प्रदान करें

  3. mysqli अंतिम सम्मिलित आईडी

  4. सर्वर समय क्षेत्र मान 'AEST' अपरिचित है या एक से अधिक समय क्षेत्र का प्रतिनिधित्व करता है

  5. एसक्यूएल पंक्तियों को हटाएं जहां आईडी का किसी अन्य तालिका से मेल नहीं है