繁体   English   中英

SqlAlchemy与关联对象的多对多关系问题

[英]SqlAlchemy Many to Many relationship with an association object issues

使用关联表中的其他字段来建立多对多关系时,我遇到很多麻烦。 我觉得自己已经很接近了,但是却收到一个sqlite3.operational错误,提示tbl_contacts.contact不存在。

谁能给我一个关于我做错了什么的线索?

这是代码:

import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy import orm

import uuid

Base = declarative_base()
Session = orm.sessionmaker()
Engine = sa.create_engine('sqlite:///arandomdb', echo=True)
Session.configure(bind=Engine)
session = Session()


class TblEvents(Base):
    __tablename__ = 'tbl_events'
    guid = sa.Column(sa.String(36), primary_key=True, nullable=False)
    name = sa.Column(sa.String)

    contacts = orm.relationship('TblContacts', secondary='tbl_events_contacts', backref='events')


class TblContacts(Base):

    __tablename__ = 'tbl_contacts'

    guid = sa.Column(sa.String(36), primary_key=True, nullable=False)
    name = sa.Column('contact', sa.String)


class TblEventsContacts(Base):

    __tablename__ = 'tbl_events_contacts'

    event_id = sa.Column(sa.String, sa.ForeignKey(TblEvents.guid), primary_key=True)
    contact_id = sa.Column(sa.String, sa.ForeignKey(TblContacts.guid), primary_key=True)
    primary = sa.Column(sa.Boolean)

    event = orm.relationship('TblEvents',
                             backref=orm.backref('tbl_events_contacts',
                                                 passive_deletes='all'
                             ))
    contact = orm.relationship('TblContacts',
                               backref=orm.backref('events_assoc',
                                                   passive_deletes='all'))


if __name__ == '__main__':
    Base.metadata.create_all(Engine)

    ev1 = TblEvents(guid=str(uuid.uuid4()), name='event 1')
    con1 = TblContacts(guid=str(uuid.uuid4()), name='contact 1')
    session.add(ev1, con1)
    session.commit()

    ev1.contacts.append(con1)
    session.commit()

这是错误:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: tbl_contacts.contact [SQL: 'SELECT tbl_contacts.contact AS tbl_contacts_contact, tbl_contacts.guid AS tbl_contacts_guid \nFROM tbl_contacts, tbl_events_contacts \nWHERE ? = tbl_events_contacts.event_id AND tbl_contacts.guid = tbl_events_contacts.contact_id'] [parameters: ('889ff3f2-d2bd-4e3e-b71d-cef224c3c671',)] (Background on this error at: http://sqlalche.me/e/e3q8)

糟糕,这当然是愚蠢的。

这行是错误的:

name = sa.Column('contact', sa.String)

本来应该:

name = sa.Column(sa.String)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM