首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用SqlAlchemy从多值字段中获取对象列表?

问如何使用SqlAlchemy从多值字段中获取对象列表?
EN

Stack Overflow用户
提问于 2021-01-15 19:34:36
回答 1查看 352关注 0票数 0

我有来自我的客户端的MS文件(.accdb),需要用declarative_base类描述表和列。正如我在表构造函数中所看到的,其中一列具有整数值,并且与另一表(外键)中的另一列有“一对多”的关系。但实际上在这个外键中存储的不是单个整数值,而是用数字值分隔的字符串分号。这种技术被称为“多值字段”。事实上,这是“多对多”的关系,没有关联表。

非常简化的计划:

代码语言:javascript
复制
Persons
-------------
id - Integer
name - String
vacancy_id - Integer (multi-value, Foreign key of Vacancies.id)

Vacancies
-------------
id - Integer
vacancy_name - String

我尝试使用declarative_base父类将类映射到表。但是在没有关联表的情况下,无法找到如何声明“多对多”关系。现在我有了这样的密码。

代码语言:javascript
复制
Base = declarative_base()


class Vacancy(Base):
    __tablename__ = 'Vacancies'
    id = sa.Column(sa.Integer, name='id', primary_key=True, autoincrement=True)
    vacancy_name = sa.Column(sa.String(255), name='vacancy_name')


class Person(Base):
    __tablename__ = 'Persons'
    id = sa.Column(sa.Integer, name='id', primary_key=True, autoincrement=True)
    name = sa.Column(sa.String(255), name='name')
    vacancy_id = sa.Column(sa.Integer, ForeignKey(Vacancy.id), name='vacancy_id')
    vacancies = relationship(Vacancy)

在请求人期间,我有一种奇怪的行为:

如果没有指定

  • ,则得到Person.vacancies为None;如果vacancy_id指定为单个值(即"1"),则在Person.vacancies中得到空缺类的单个对象;如果vacancy_id指定为多个值(即"1;2;3"),则
  • 也没有。

当然,我可以请求原始的Person.vacancy_id,用分号分割它,并请求获得ID列表的空缺。

但我想知道-- SqlAlchemy是否能处理“多值字段”?处理这些档案的最佳方法是什么?

更新,目前我做了以下的解决办法,以自动解析多值列。这应该添加到Person类中:

代码语言:javascript
复制
@orm.reconstructor
def load_on_init(self):
    if self.vacancy_id:
        ids = self.vacancy_id.split(';')
        self.vacancies = [x for x in Vacancy.query.filter(Vacancy.id.in_(ids)).all()]
    else:
        self.vacancies = []

空缺类应具有灵活的属性:

代码语言:javascript
复制
query = DBSession.query_property()

最后,我们必须为课堂使用做好准备:

代码语言:javascript
复制
engine = create_engine(CONNECTION_URI)
DBSession = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-16 00:00:14

Access ODBC对多值查找字段的支持非常有限。这些字段实际上是使用隐藏的关联表(名称类似于f_1BC9E55B5578456EB5ACABC99BB2FF0B_vacancies)实现的,但是这些表不能从SQL语句中访问:

代码语言:javascript
复制
SELECT * from f_1BC9E55B5578456EB5ACABC99BB2FF0B_vacancies

导致错误

Microsoft数据库引擎找不到输入表或查询'‘。确保其存在,并确保其名称拼写正确。

正如您已经发现的,Access ODBC将读取多个条目的键值,并将它们表示为可以解析的分号分隔列表,但不能更新这些值。

代码语言:javascript
复制
UPDATE Persons SET vacancies = '1;2' WHERE id = 1

失败与

更新或删除查询不能包含多值字段.(-3209)

因此,TL;DR,如果您只需要从数据库中读取,那么您的解决方案可能就足够了,但是如果您需要修改那些多值字段,那么访问ODBC将不会完成您的工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65742509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档