我有来自我的客户端的MS文件(.accdb),需要用declarative_base类描述表和列。正如我在表构造函数中所看到的,其中一列具有整数值,并且与另一表(外键)中的另一列有“一对多”的关系。但实际上在这个外键中存储的不是单个整数值,而是用数字值分隔的字符串分号。这种技术被称为“多值字段”。事实上,这是“多对多”的关系,没有关联表。
非常简化的计划:
Persons
-------------
id - Integer
name - String
vacancy_id - Integer (multi-value, Foreign key of Vacancies.id)
Vacancies
-------------
id - Integer
vacancy_name - String我尝试使用declarative_base父类将类映射到表。但是在没有关联表的情况下,无法找到如何声明“多对多”关系。现在我有了这样的密码。
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.vacancy_id,用分号分割它,并请求获得ID列表的空缺。
但我想知道-- SqlAlchemy是否能处理“多值字段”?处理这些档案的最佳方法是什么?
更新,目前我做了以下的解决办法,以自动解析多值列。这应该添加到Person类中:
@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 = []空缺类应具有灵活的属性:
query = DBSession.query_property()最后,我们必须为课堂使用做好准备:
engine = create_engine(CONNECTION_URI)
DBSession = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()发布于 2021-01-16 00:00:14
Access ODBC对多值查找字段的支持非常有限。这些字段实际上是使用隐藏的关联表(名称类似于f_1BC9E55B5578456EB5ACABC99BB2FF0B_vacancies)实现的,但是这些表不能从SQL语句中访问:
SELECT * from f_1BC9E55B5578456EB5ACABC99BB2FF0B_vacancies导致错误
Microsoft数据库引擎找不到输入表或查询'‘。确保其存在,并确保其名称拼写正确。
正如您已经发现的,Access ODBC将读取多个条目的键值,并将它们表示为可以解析的分号分隔列表,但不能更新这些值。
UPDATE Persons SET vacancies = '1;2' WHERE id = 1失败与
更新或删除查询不能包含多值字段.(-3209)
因此,TL;DR,如果您只需要从数据库中读取,那么您的解决方案可能就足够了,但是如果您需要修改那些多值字段,那么访问ODBC将不会完成您的工作。
https://stackoverflow.com/questions/65742509
复制相似问题