我有一个运行sqlalachemy的Flask应用程序。我对sqlalchemy很新,所以我真的很困惑。我做了很多课:
用户 课程 演讲 注意 队列 资产
所有这些都有关系 - 用户有很多课程,课程有很多用户,用户有很多讲座,讲座有很多用户,用户有很多笔记,笔记有很多用户,课程有很多讲座,讲座有很多笔记,课程有很多笔记,讲座有1到1个队列,用户可以有很多队列,队列需要很多用户等等。
所以每当我创建一个讲座时,我是否也必须在与其相关的所有其他事情中实例化它?
例如,这是我为编写新课程而编写的代码
def createLecture(user, course):
# user and course are existing objects fetched from the db already
# create new lecture
newLecture = Lecture()
db.session.add(newLecture)
# add lecture to course, add new queue to lecture, add user to queue, add user to lecture
course.lectures.append(newLecture)
lecture.users.append(user)
newQueue = Queue()
db.session.add(newQueue)
newQueue.users.append(user)
newQueue.lecture = newLecture
db.session.commit()
return newLecture
这让我感到非常复杂和令人困惑。除了令人困惑之外,我甚至不知道我是否涵盖了我应该做的所有关系(很容易忘记那么多人)。
当新对象与具有各种关系的许多其他对象绑定时,必须有一些更好的方法来添加它。
我怎样才能更有条理?
答案 0 :(得分:0)
由于这是一个复杂的数据库模式,我仔细检查了每个关系并确保它已正确指定。
在检查我的模式时,我认为某些关系可以在实例化时实现,这是减少代码混乱的最佳方法。
所以我上面的例子写成:
def createLecture(user, course):
# create new lecture
now = datetime.now()
dt = now.strftime("%Y-%m-%d-%H-%M")
newLecture = Lecture(dt, course)
db.session.add(newLecture)
# add lecture to course, add new queue to lecture, add user to queue, add new user to lecture
newQueue = Queue(newLecture)
db.session.add(newQueue)
newLecture.users.append(user)
newQueue.users.append(user)
newLecture.groupID = pad.createGroupIfNotExistsFor(newLecture.course.name+dt)['groupID']
db.session.commit()
return newLecture