用SqlAlchemy检索Python中ForeignKey映射的对象

2024-05-08 02:24:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个现有的数据库,我正试图映射到SqlAlchemy的ORM中。我想让它找出已经存在于数据库中的ForiegnKey关系。你知道吗

以下是我目前掌握的代码:

from sqlalchemy import create_engine, MetaData, Table 
from sqlalchemy.orm import create_session
from sqlalchemy.ext.declarative import declarative_base

# connect to database and infer from structure
Base = declarative_base()
engine = create_engine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
metadata = MetaData(bind=engine)

class Club(Base):
    __table__ = Table('clubs', metadata, autoload=True)
    def __repr__(self):
        return "<Club: %s>" % (self.name,)

class Member(Base):
    __table__ = Table('members', metadata, autoload=True)
    def __repr__(self):
        return "<Member: %s of %d>" % (self.name, self.club_id)

以下是SQL表转储:

CREATE TABLE `clubs` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(45) collate utf8_bin default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `members` (
  `id` int(11) NOT NULL auto_increment,
  `club_id` int(11) default NULL,
  `name` VARCHAR(100) default NULL,
  PRIMARY KEY  (`id`),
  KEY `fk_members_club_idx` (`club_id`),
  CONSTRAINT `fk_members_club` FOREIGN KEY (`club_id`) REFERENCES `clubs` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我的问题是,例如,在Member__repr__函数中,我想打印Clubname,而不是打印club_id(这对人类没用)。像member.club.name这样的东西是理想的。你知道吗

除非我定义了自己的表,而不仅仅是在代码中反映它们,否则我无法在SqlAlchemy文档上找到如何执行这些操作,这就是我在这里要做的。你知道吗


Tags: keynamefromimportselfidsqlalchemycreate
1条回答
网友
1楼 · 发布于 2024-05-08 02:24:37

只需将Member类更改为如下所示:

class Member(Base):
    __table__ = Table('members', metadata, autoload=True)
    club = relationship(Club, backref="members")
    def __repr__(self):
        return "<Member: %s of %s>" % (self.name, self.club.name)

关键是反射(autoload)不会在类之间自动创建relationships,因此必须显式定义它们。你知道吗

相关问题 更多 >