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

SQLAlchemy beberapa kunci asing dalam satu kelas yang dipetakan ke kunci utama yang sama

Mencoba menghapus kutipan dari foreign_keys dan menjadikannya daftar. Dari dokumentasi resmi tentang Relationship Configuration: Handling Multiple Join Paths

Berubah di versi 0.8:relationship() dapat menyelesaikan ambiguitas antara target kunci asing berdasarkan foreign_keys argumen saja;primaryjoin argumen tidak lagi diperlukan dalam situasi ini.

Kode mandiri di bawah ini berfungsi dengan sqlalchemy>=0.9 :

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

engine = create_engine(u'sqlite:///:memory:', echo=True)
session = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()

#The business case here is that a company can be a stakeholder in another company.
class Company(Base):
    __tablename__ = 'company'
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)

class Stakeholder(Base):
    __tablename__ = 'stakeholder'
    id = Column(Integer, primary_key=True)
    company_id = Column(Integer, ForeignKey('company.id'), nullable=False)
    stakeholder_id = Column(Integer, ForeignKey('company.id'), nullable=False)
    company = relationship("Company", foreign_keys=[company_id])
    stakeholder = relationship("Company", foreign_keys=[stakeholder_id])

Base.metadata.create_all(engine)

# simple query test
q1 = session.query(Company).all()
q2 = session.query(Stakeholder).all()


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ID penetapan otomatis Rails yang sudah ada

  2. cursor.execute(INSERT INTO im_entry.test (+entrym+) VALUES ('+p+');)

  3. Kesalahan Postgres:Lebih dari satu baris dikembalikan oleh subquery yang digunakan sebagai ekspresi

  4. Panggilan untuk makalah untuk PGDay.IT 2011 telah diperpanjang

  5. Dapatkan nilai serial default setelah INSERT di dalam PL/pgSQL