python - 使用 SqlAlchemy 在 Python 中检索外键映射对象

标签 python mysql orm sqlalchemy

我有一个现有的数据库,我正试图将其映射到 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__ 函数中,不是打印 club_id(这对人类无用),我想打印俱乐部 name。像 member.club.name 这样的东西是理想的。

我无法在 SqlAlchemy 文档中找到如何执行此操作,除非我定义了自己的表,而不仅仅是在我的代码中反射(reflect)它们,这正是我在这里所做的。

最佳答案

只需将您的 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)

重点是反射(自动加载)不会自动创建类之间的关系,因此您必须显式定义它们。

关于python - 使用 SqlAlchemy 在 Python 中检索外键映射对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21414997/

相关文章:

大型表(> 8000 行)上的 MySQL MIN GROUP BY

mysql - 在JavaFX环境中使用JPA

orm - ColdFusion ORM如何更新不掉线?

java - 'source code does not match the bytecode' 使用IDEA调试JdbcTemplate

python - 如何追溯日志错误?

python - 将由空格分隔的整数字符串更改为 int 列表

MySql - 如何从表中自动删除特定行

node.js - 映射两个模型与吃水线的关系

python - 为什么python找不到我安装了django-lockdown的这个模块?

python - python中的聊天服务器/客户端