SQLAlchemy Automap不为没有主键的表创建类

37 投票
1 回答
24684 浏览
提问于 2025-04-18 07:07

我正在使用 SQL Alchemy 的版本 0.9.1,这个版本有一个叫做自动映射的功能。这个功能可以让我自动创建类和它们之间的关系。http://docs.sqlalchemy.org/en/rel_0_9/orm/extensions/automap.html

我遇到的问题是,当我使用 automap_base 的时候,发现并不是所有在 metadata.tables 列表中的表都被映射了。

在准备过程中没有错误,唯一的问题是我无法从 Base 访问类(比如说 Base.classes.Example_Table),在调用 automap_base() 之后。

from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import create_session

from sqlalchemy.ext.automap import automap_base

engine = create_engine("mysql+mysqldb://")

Base = automap_base()
Base.prepare(engine, reflect = True)

session = create_session(bind = engine)

然后我发现并不是所有在 metadata 中的表都有对应的类(我没有在 metadata 中使用 only = [] 这个参数)

for mappedclass in Base.classes:
    print mappedclass

for mdtable in metadata.tables:
    print mdtable

结果发现 Example_Table(使用以下创建语法)没有对应的类

    CREATE TABLE `Example_Table` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `attributeType` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3290719 DEFAULT CHARSET=latin1

也就是说,Base.class.Example_Table 返回了以下错误

    ---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-15-94492ae1b8ba> in <module>()
      7 type(metadata.tables)
      8 
----> 9 Base.classes.Example_Table

/usr/local/lib/python2.7/site-packages/sqlalchemy/util/_collections.pyc in __getattr__(self, key)
    172             return self._data[key]
    173         except KeyError:
--> 174             raise AttributeError(key)
    175 
    176     def __contains__(self, key):

AttributeError: Example_Table

我觉得这个问题不是因为我的 Example_Table 名字里有下划线。

我认为问题可能和我的 Example_Table 没有主键有关。这个 Example_Table 只是用来连接另外两个表。

1 个回答

60

我通过仔细研究参考资料和重新思考问题找到了答案。

如果这对其他人有帮助的话 -

因为SQLAlchemy的ORM(对象关系映射)是基于身份映射模型的,所以不能对没有主键的表进行映射(或者自动映射)。必须指定一个任意的主键。

http://docs.sqlalchemy.org/en/latest/faq/ormconfiguration.html#how-do-i-map-a-table-that-has-no-primary-key

撰写回答