gpt4 book ai didi

python - SQLAlchemy 不支持的类型错误 - 和表设计问题?

转载 作者:太空宇宙 更新时间:2023-11-04 11:04:24 25 4
gpt4 key购买 nike

再次返回一些 SQLAlchemy 恶作剧。

让我逐步解决这个问题。

我的表现在设置如下:

engine = create_engine('sqlite:///:memory:', echo=False)
metadata = MetaData()
students_table = Table('studs', metadata,
Column('sid', Integer, primary_key=True),
Column('name', String),
Column('preferences', Integer),
Column('allocated_rank', Integer),
Column('allocated_project', Integer)
)
metadata.create_all(engine)
mapper(Student, students_table)

相当简单,在大多数情况下,只要我避免以下错误情况,我就可以查询几乎任何我想要的信息。

它映射的类是:

class Student(object):
def __init__(self, sid, name):
self.sid = sid
self.name = name
self.preferences = collections.defaultdict(set)
self.allocated_project = None
self.allocated_rank = 0

def __repr__(self):
return str(self)

def __str__(self):
return "%s %s" %(self.sid, self.name)

说明:preferences 基本上是学生希望分配的所有项目的集合。当分配算法启动时,学生的 allocated_project 会从此偏好集中出现。

现在,如果我尝试这样做:

for student in students.itervalues():
session.add(student)

session.commit()

它抛出两个错误,一个针对 allocated_project 列(如下所示),另一个类似的错误针对 preferences 列:

sqlalchemy.exc.InterfaceError: (InterfaceError) Error binding parameter 4 
- probably unsupported type. u'INSERT INTO studs (sid, name, allocated_rank,
allocated_project) VALUES (?, ?, ?, ?, ?, ?, ?)'
[1101, 'Muffett,M.', 1, 888 Human-spider relationships (Supervisor id: 123)]

如果我回到我的代码,我发现,当我从给定的文本文件中复制 preferences 时,它实际上指的是 Project 类映射到字典,使用唯一的项目 ID (pid) 作为键。因此,当我通过每个学生的 rankpreferences 集遍历每个学生时,它添加不是项目 ID,而是对projects 字典中的项目 ID。

students[sid].preferences[int(rank)].add(projects[int(pid)])

现在这对我来说非常有用,因为我可以找到关于学生首选项目的所有信息,而无需运行另一次检查以提取有关项目 ID 的信息。您在错误中看到的表单将对象打印信息传递为:

return "%s %s (Supervisor id: %s)" %(self.proj_id, self.proj_name, self.proj_sup)

我的问题是:

  1. 我正在尝试将对象存储在数据库字段中,不是吗?

  2. 那么正确的方法是将项目信息(项目 ID、名称等)复制到它自己的表中,并由唯一的项目 ID 引用吗?这样我就可以让其中一个学生表的项目 ID 字段只是一个整数 ID,当我需要更多信息时,只需 join 表?其他表等等?

  3. 如果上面说的有道理,那么如何维护一个表中作为另一个表的键索引的信息列的关系?

  4. 这是否归结为数据库设计问题?

  5. 还有其他优雅的方法可以实现这一点吗?

如果这是一个冗长的问题,我们深表歉意。解决这个问题对我来说相当重要,所以我尽可能多地解释,同时试图表明我正在尝试(可悲的是这里的关键词)来理解可能发生的事情错了。

最佳答案

您期望 SQLAlchemy 神奇地将您的对象和对象集合转换为整数值吗?不可能。 SQLAlchemy 可以将相关对象存储在单独的表中或序列化,但它没有心灵感应算法来读懂你的想法。因此,您必须明确描述您的选择。

问题的答案:

  1. 是的,添加到 session 然后提交会将您的对象存储到数据库。
  2. 是的,将相关对象存储在单独的表中是很常见的习惯用法。 SQLAlchemy 处理得很好,因此在大多数情况下您不需要显式指定联接。
  3. good chapter在有关此主题的 SQLAlchemy 教程中。
  4. 将相关对象存储在单独的表中不会导致数据库设计问题。这是大多数情况下使用的成语。
  5. 在大多数情况下,使用单独的表格是最好的方法。但是还有一个 PickleType 列类型,它使用 BLOB 来存储序列化对象。

关于python - SQLAlchemy 不支持的类型错误 - 和表设计问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2609719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com