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

Sqlalchemy:द्वितीयक संबंध अद्यतन

समस्या यह है कि आप यह सुनिश्चित करना चाहते हैं कि आपके द्वारा बनाए गए उदाहरण अद्वितीय हैं। हम एक वैकल्पिक कंस्ट्रक्टर बना सकते हैं जो मौजूदा अनकमिटेड इंस्टेंस के कैशे की जांच करता है या एक नया इंस्टेंस वापस करने से पहले मौजूदा कमिटेड इंस्टेंस के लिए डेटाबेस से पूछताछ करता है।

इस तरह की एक विधि का प्रदर्शन यहां दिया गया है:

from sqlalchemy import Column, Integer, String, ForeignKey, Table
from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative.api import declarative_base
from sqlalchemy.orm import sessionmaker, relationship

engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(engine)
Base = declarative_base(engine)

session = Session()


class Role(Base):
    __tablename__ = 'role'

    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False, unique=True)

    @classmethod
    def get_unique(cls, name):
        # get the session cache, creating it if necessary
        cache = session._unique_cache = getattr(session, '_unique_cache', {})
        # create a key for memoizing
        key = (cls, name)
        # check the cache first
        o = cache.get(key)
        if o is None:
            # check the database if it's not in the cache
            o = session.query(cls).filter_by(name=name).first()
            if o is None:
                # create a new one if it's not in the database
                o = cls(name=name)
                session.add(o)
            # update the cache
            cache[key] = o
        return o


Base.metadata.create_all()

# demonstrate cache check
r1 = Role.get_unique('admin')  # this is new
r2 = Role.get_unique('admin')  # from cache
session.commit()  # doesn't fail

# demonstrate database check
r1 = Role.get_unique('mod')  # this is new
session.commit()
session._unique_cache.clear()  # empty cache
r2 = Role.get_unique('mod')  # from database
session.commit()  # nop

# show final state
print session.query(Role).all()  # two unique instances from four create calls

create_unique विधि SQLAlchemy wiki के उदाहरण से प्रेरित थी। . लचीलेपन पर सादगी के पक्ष में, यह संस्करण बहुत कम जटिल है। मैंने इसे बिना किसी समस्या के उत्पादन प्रणालियों में उपयोग किया है।

स्पष्ट रूप से सुधार हैं जिन्हें जोड़ा जा सकता है; यह सिर्फ एक साधारण उदाहरण है। get_unique विधि को UniqueMixin . से इनहेरिट किया जा सकता है , किसी भी संख्या में मॉडल के लिए उपयोग किया जाना है। तर्कों के अधिक लचीले संस्मरण को लागू किया जा सकता है। यह चींटियों आस्मा द्वारा उल्लिखित परस्पर विरोधी डेटा डालने वाले कई थ्रेड्स की समस्या को भी अलग रखता है; इसे संभालना अधिक जटिल है लेकिन एक स्पष्ट विस्तार होना चाहिए। मैं इसे आप पर छोड़ता हूं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में संदर्भित तालिका पर एक बाधा के साथ एक विदेशी कुंजी कैसे बनाएं

  2. एक बहु-सर्वर वातावरण में, यदि किसी साइट में 15 मिलियन से अधिक निष्क्रियता है, तो सर्वर PostgreSQL डेटाबेस से कनेक्शन खो देता है

  3. SQL सर्वर किस कार्डिनैलिटी पर एक इंडेक्स स्कैन (बनाम तलाश) पर स्विच करता है

  4. PostgreSQL में टाइम ज़ोन ऑफ़सेट के साथ वर्तमान दिनांक और समय कैसे प्राप्त करें

  5. पुनरावर्ती CTE में डुप्लिकेट आइटम का पता लगाएं