我如何 "link" 一个 web2py 数据库?

How do I "link" a web2py database?

我正在尝试为 web2py 中的股票数据创建一个数据库,例如,A 公司持有 2010、2011、2012 年的股权数据......而 B 公司持有 2010 年、2011 年、2012 年的股权数据...... 这是我想出的。

db.define_table(
    'company',
    Field('name'),
    format = '%(name)s')

db.define_table(
    'years',
    Field('fiscal_year'),
    format = '%(fiscal_year)s')

db.define_table(
    'stock_data',
    Field('company_id', db.company),
    Field('years_id', db.years),
    Field('equity', 'integer'),
    format = '%(equity)s %(years_id)s -> %(company_id)s')

db.company.name.requires = IS_NOT_IN_DB(db, 'company.name')
db.years.fiscal_year.requires = IS_NOT_IN_DB(db, 'years.fiscal_year') 

问题是我可以用不同的值多次为一家公司重复同一年。 我怎样才能"link"一年到一家公司,那一年的股权价值。

假设您希望 company_idyears_id 组合 是唯一的,您可以这样做:

db.define_table(
    'stock_data',
    Field('company_id', db.company),
    Field('years_id', db.years),
    Field('equity', 'integer'),
    format = '%(equity)s %(years_id)s -> %(company_id)s')

matching_company_id = db.stock_data.company_id == request.vars.company_id
unique_company_year = IS_NOT_IN_DB(db(matching_company_id), 'stock_data.years_id')
db.stock_data.years_id.requires = IS_IN_DB(db, 'years.id', db.years._format,
                                           _and=unique_company_year)

在上面,unique_company_year 确保 years_id 的提交值在 company_id 与提交的 company_id 匹配的记录集中是唯一的(这保证company_id/years_id 对是唯一的,同时允许单独在任一字段上使用 non-unique 值)。然后,此 IS_NOT_IN_DB 验证器作为 _and 参数传递给该字段的标准 IS_IN_DB 验证器。