PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Sqlalchemy:cập nhật mối quan hệ phụ

Vấn đề là bạn muốn đảm bảo rằng các phiên bản bạn tạo là duy nhất. Chúng tôi có thể tạo một phương thức khởi tạo thay thế để kiểm tra bộ nhớ cache của các phiên bản không giới hạn hiện có hoặc truy vấn cơ sở dữ liệu đối với phiên bản được cam kết hiện có trước khi trả về một phiên bản mới.

Đây là một minh chứng của một phương pháp như vậy:

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 phương pháp này được lấy cảm hứng từ ví dụ từ SQLAlchemy wiki . Phiên bản này ít phức tạp hơn nhiều, thiên về sự đơn giản hơn là tính linh hoạt. Tôi đã sử dụng nó trong các hệ thống sản xuất mà không gặp vấn đề gì.

Rõ ràng là có những cải tiến có thể được thêm vào; đây chỉ là một ví dụ đơn giản. get_unique phương thức có thể được kế thừa từ UniqueMixin , được sử dụng cho bất kỳ số lượng mô hình nào. Việc ghi nhớ các đối số linh hoạt hơn có thể được thực hiện. Điều này cũng loại bỏ vấn đề nhiều luồng chèn dữ liệu xung đột được đề cập bởi Ants Aasma; xử lý phức tạp hơn nhưng phải là một phần mở rộng rõ ràng. Tôi để đó cho bạn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. bên trong lat, lng giới hạn nơi truy vấn

  2. Làm thế nào để liệt kê các kết nối đang hoạt động trên PostgreSQL?

  3. PostgreSQL tạo một cột mới với các giá trị được điều chỉnh trên các cột khác

  4. Tôi lấy nguồn libpq ở đâu?

  5. Cách make_date () hoạt động trong PostgreSQL