首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有可能修改一个表,在python的datajoint中包含对上游表的引用?

有没有可能修改一个表,在python的datajoint中包含对上游表的引用?
EN

Stack Overflow用户
提问于 2021-04-03 06:06:53
回答 1查看 42关注 0票数 0

我们希望修改一个表,使其包含一个对新表的非主键引用。旧的定义是:

代码语言:javascript
复制
@schema
class SpikeSortingParameters(dj.Manual):
    definition = """
    # Table for holding parameters for each spike sorting run
    -> SortGroup
    -> SpikeSorterParameters
    -> SortInterval
    ---
    -> SpikeSortingMetrics
    -> IntervalList
    import_path = '': varchar(200) # optional path to previous curated sorting output
    """

我们想要添加一个

代码语言:javascript
复制
-> SpikeSortingArtifactParameters 

作为一个非主键,在我们花时间尝试让它工作之前,我们想知道这是否可能,因为我们不知道在这里分配默认值的方法。

先谢谢你...

Loren

EN

回答 1

Stack Overflow用户

发布于 2021-04-05 08:04:01

不幸的是,table.alter()目前不支持外键更新。有一个可以使用的解决方法,但有几个步骤,这些步骤应该小心采取。最好将此作为功能请求提交到issue tracker中。

使用Alter

例如,考虑以下内容:

如果您有两个定义如下的表:

代码语言:javascript
复制
import datajoint as dj

schema = dj.Schema('rguzman_alter_example')

@schema
class Student(dj.Lookup):
    definition = """
    student_first_name: varchar(30)
    student_last_name: varchar(30)
    ---
    student_location: varchar(30)
    """
    contents = [('Joe', 'Schmoe', 'Los Angeles, CA'), ('Suzie', 'Queue', 'Miami, FL')]

@schema
class Assignment (dj.Lookup):
    definition = """
    assignment_id: int
    ---
    assignment_due_date: date
    #-> [nullable] Student # Standard way to define a foreign key on secondary attributes with NULL as default
    """
    contents = [dict(assignment_id=100, assignment_due_date='2021-04-21')]

现在假设您希望在辅助属性上有一个外键,并将NULL作为默认值。您可以将选项传递给辅助属性中的外键(请参阅上面的注释,其中我们允许它缺省为NULL)。以这种方式从头开始初始化表就可以了。对于我们希望在用现有数据初始化表之后在辅助属性上添加外键的情况,只要我们建立一个默认值来填充现有记录,Assignment.alter()将是实现这一目标的最佳方法。让我们看看在取消注释辅助属性上的外键、重新定义Assignment表类并尝试更改时会发生什么。

代码语言:javascript
复制
---------------------------------------------------------------------------
NotImplementedError                       Traceback (most recent call last)
<ipython-input-23-09997168281c> in <module>
----> 1 Assignment.alter()

~/.local/lib/python3.7/site-packages/datajoint/table.py in alter(self, prompt, context)
     84             del frame
     85         old_definition = self.describe(context=context, printout=False)
---> 86         sql, external_stores = alter(self.definition, old_definition, context)
     87         if not sql:
     88             if prompt:

~/.local/lib/python3.7/site-packages/datajoint/declare.py in alter(definition, old_definition, context)
    367         raise NotImplementedError('table.alter cannot alter the primary key (yet).')
    368     if foreign_key_sql != foreign_key_sql_:
--> 369         raise NotImplementedError('table.alter cannot alter foreign keys (yet).')
    370     if index_sql != index_sql_:
    371         raise NotImplementedError('table.alter cannot alter indexes (yet)')

NotImplementedError: table.alter cannot alter foreign keys (yet).

哦,有个例外...所以事实证明,它还没有在这个用例中实现。但是,有一个可以利用的手动解决方案,所以让我详细介绍这些步骤,直到有支持为止。

解决方法

模式类分配(dj.Lookup):definition =F“”assignment_id: int - assignment_due_date: date {newline.join('‘+ a.name + '=null:’+ a.type for a in Student.heading.attributes.values() if a.in_key)}“”contents = dict(assignment_id=100,assignment_due_date='2021-04-21')

这将把父表的主要属性“复制”到子表的次要属性中,就像往常一样:Assignment.alter()

  • Manually直接使用table.

  • Perform查询添加外键。如下所示:q=“ALTER TABLE {table} ADD FOREIGN KEY ({fk}) REFERENCES {ref} ({pk}) ON UPDATE CASCADE ON DELETE RESTRICT”.format(table=Assignment.full_table_name,fk=','.join(f'{k}‘for k in Student.primary_key),ref=f'{Student.table\_name}',pk=','.join(f'{k}‘表示Student.primary_key中的k)) dj.conn().query(q)

确保删除在步骤1中添加的部分,并将其替换为正确的规范,即-> [nullable] Student

  • Restart
  1. 要验证它是否已正确设置,请检查Assignment.describe()。如果一切正常,结果应该是: assignment_id : int - assignment_due_date : date ->可空学生

此外,任何预先存在的记录现在都应该预先填充NULL.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66925812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档