डुप्लिकेट कुंजी अद्यतन पर
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