2015-05-20 20 views
7

Come posso creare una relazione senza avere una chiave esterna?Definire la relazione senza chiave esterna

@declared_attr 
def custom_stuff(cls): 
    joinstr = 'foreign(Custom.name) == "{name}"'.format(name=cls.__name__) 
    return db.relationship('Custom', primaryjoin=joinstr) 

Questo genera un errore:
ArgumentError: Could not locate any simple equality expressions involving locally mapped foreign key columns for primary join condition

Questo funziona, ma penso che sia una bella brutto hack.

@declared_attr 
def custom_stuff(cls): 
    joinstr = 'or_(
        and_(foreign(Custom.name) == MyTable.title, 
         foreign(Custom.name) != MyTable.title), 
        foreign(Custom.name) == "{name}")'.format(name=cls.__name__) 
    return db.relationship('Custom', primaryjoin=joinstr) 

C'è un modo migliore per farlo?

EDIT: l'attributo in più deve essere aggiunto come @declared_attr e deve utilizzare un rapporto, dal momento che il nostro serializer è scritto in modo che funziona con attrs declarred.

Fare questo con @hybrid_property o qualcos'altro funzionerebbe, ma il nostro serializzatore json si romperebbe. Farlo funzionare sembra più difficile che definire una relazione.

risposta

-2

Forse dovresti indicare il significato della parola "relazione". Si afferma che alcune cose "dipendono" da qualche altra cosa o entrambe dipendono l'una dall'altra. Se si sta tentando di definire una relazione sul modello ERM (Entity Relationship Model) significa che è lo stato che una delle entità "dipende" dall'altra. Inoltre, i database hanno alcuni hack per affrontare più velocemente le tabelle relative tra loro rispetto alle semplici tabelle che sono correlate in modo astratto. C'è qualche ragione per cui devi farlo?

+0

Questo non fornisce una risposta alla domanda. – SaeX

0

Non è necessario definire necessariamente relazioni durante la creazione di tabelle in un database (ciò vale per quasi tutti gli SQL). È comunque possibile unire tabelle che non hanno una relazione di chiave esterna predefinita (il motivo principale per le chiavi esterne è quello di rafforzare la coerenza dei dati, non definire cosa è possibile unire o meno).

Vai a questa di rinvio - http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.join

Se desideri comunque a "spettacolo" del database e la tabella struttura/modello, allora meglio usare qualche modellatore rapporto entità come ERwin (o qualche software di diagrammi).

+0

più qui - http://stackoverflow.com/questions/5771190/can-we-join-two-tables-without-primary-foreign-key-relation – kasparg

+1

Correction, I "should" essere in grado di definire una relazione senza foreing chiavi. Il problema è che sqlalchemy genera un errore in quel caso e vorrei scoprire come farlo funzionare. – zidarsk8