PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Sqlalchemy:pembaruan hubungan sekunder

Masalahnya adalah Anda ingin memastikan instance yang Anda buat unik. Kita dapat membuat konstruktor alternatif yang memeriksa cache dari instance uncommited yang ada atau menanyakan database untuk instance commited yang ada sebelum mengembalikan instance baru.

Berikut adalah demonstrasi metode tersebut:

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 metode ini terinspirasi oleh contoh dari wiki SQLAlchemy . Versi ini jauh lebih tidak berbelit-belit, lebih menyukai kesederhanaan daripada fleksibilitas. Saya telah menggunakannya dalam sistem produksi tanpa masalah.

Jelas ada perbaikan yang bisa ditambahkan; ini hanya contoh sederhana. get_unique metode dapat diwarisi dari UniqueMixin , untuk digunakan untuk sejumlah model. Memoisasi argumen yang lebih fleksibel dapat diterapkan. Ini juga mengesampingkan masalah banyak utas yang memasukkan data yang saling bertentangan yang disebutkan oleh Semut Aasma; penanganan yang lebih kompleks tetapi harus menjadi ekstensi yang jelas. Saya serahkan itu kepada Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagian 2:cara mendapatkan Jumlah kueri berbasis partisi tanpa benar-benar berputar

  2. Aturan kurung PostgreSQL, apakah ada panduan yang diringkas?

  3. ValueError:Tidak dapat menambahkan *:instance ada di basis data default, nilai ada di basis data Tidak ada

  4. Apa yang ::lakukan di PostgreSQL?

  5. Apakah ADO bekerja dengan driver ODBC atau hanya penyedia OLE DB?