一对多 SQL 关系
One to many SQL relationship
- 我正在尝试在项目 table 和报告 table 之间建立一对多关系。
- 用户可以创建新项目,之后他可以创建一个或多个与该项目相关的新报告。
- 这两个 table 将用于报告问题。例如,如果我构建一个新的应用程序,我将创建一个包含我的应用程序名称的新项目。然后,当我在某些设备(如 PC 或 iPhone 上测试我的应用程序并且遇到问题时,我将创建一个关于该问题的新报告。
class Project(db.Model):
project_id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
date = db.Column(db.Date)
def __init__(self, name, date):
self.name = name
self.date = date
def __repr__(self):
return self.name
class Report(db.Model):
report_id = db.Column(db.Integer, primary_key=True)
project_id = db.Column(db.Integer, db.ForeignKey('project.project_id'))
project = db.relationship('Report', backref='reports', lazy='dynamic')
date = db.Column(db.Date)
issue = db.Column(db.Text)
def __init__(self, project_id, date, issue):
self.project_id = project_id
self.date = date
self.issue = issue
def __repr__(self):
return self.issue
问题:
两个table之间的连接是否正确为一对多关系?
这里真的需要init函数吗?我在网上看到一些没有它们的代码!
非常感谢
init 函数在那里,因此当您创建 class 的实例时,您可以设置起始值或执行初始化函数。如果你觉得不需要做这样的事情,可以省略init定义。
Flask-SQLAlchemy's documentation 包括创建一对多关系。它提供了一个 Person
有很多 Address
的例子。
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
addresses = db.relationship('Address', backref='person',
lazy='dynamic')
class Address(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(50))
person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
这与您所拥有的相符。唯一的区别是该示例将关系置于父模型上。它可以放在任一模型上。我尽量把它放在最有意义的地方。
至于您的 __init__
方法,它们很可能是不必要的。 Flask-SQLAlchemy 的 Model
class 有一个 __init__
接受关键字参数,允许您为列赋值。区别在于您的版本需要指定字段,而默认版本不需要任何字段。
您的版本仅适用于
project = Project('My Project', date(2015, 4, 23))
Model
的版本不仅以同样的方式工作,而且还像
一样工作
project = Project()
project.name = 'My Project'
project.date = date(2015, 4, 23)
- 我正在尝试在项目 table 和报告 table 之间建立一对多关系。
- 用户可以创建新项目,之后他可以创建一个或多个与该项目相关的新报告。
- 这两个 table 将用于报告问题。例如,如果我构建一个新的应用程序,我将创建一个包含我的应用程序名称的新项目。然后,当我在某些设备(如 PC 或 iPhone 上测试我的应用程序并且遇到问题时,我将创建一个关于该问题的新报告。
class Project(db.Model):
project_id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
date = db.Column(db.Date)
def __init__(self, name, date):
self.name = name
self.date = date
def __repr__(self):
return self.name
class Report(db.Model):
report_id = db.Column(db.Integer, primary_key=True)
project_id = db.Column(db.Integer, db.ForeignKey('project.project_id'))
project = db.relationship('Report', backref='reports', lazy='dynamic')
date = db.Column(db.Date)
issue = db.Column(db.Text)
def __init__(self, project_id, date, issue):
self.project_id = project_id
self.date = date
self.issue = issue
def __repr__(self):
return self.issue
问题:
两个table之间的连接是否正确为一对多关系?
这里真的需要init函数吗?我在网上看到一些没有它们的代码!
非常感谢
init 函数在那里,因此当您创建 class 的实例时,您可以设置起始值或执行初始化函数。如果你觉得不需要做这样的事情,可以省略init定义。
Flask-SQLAlchemy's documentation 包括创建一对多关系。它提供了一个 Person
有很多 Address
的例子。
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
addresses = db.relationship('Address', backref='person',
lazy='dynamic')
class Address(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(50))
person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
这与您所拥有的相符。唯一的区别是该示例将关系置于父模型上。它可以放在任一模型上。我尽量把它放在最有意义的地方。
至于您的 __init__
方法,它们很可能是不必要的。 Flask-SQLAlchemy 的 Model
class 有一个 __init__
接受关键字参数,允许您为列赋值。区别在于您的版本需要指定字段,而默认版本不需要任何字段。
您的版本仅适用于
project = Project('My Project', date(2015, 4, 23))
Model
的版本不仅以同样的方式工作,而且还像
project = Project()
project.name = 'My Project'
project.date = date(2015, 4, 23)