标签: foreign-keys

Rails 迁移——暂时忽略外键约束?

我正在尝试将表的id字段更改为uuid

这是我的代码:

class AddUuidToProjects < ActiveRecord::Migration[5.0]
  def up
    add_column :projects, :uuid, :string, limit:36, null: false, first: true
    add_column :projects, :old_id, :integer

    Project.all.each do |p|
      p.update!(old_id: p.id)
    end
    change_table :projects do |t|
      t.remove :id
      t.rename :uuid, :id
    end
    execute "ALTER TABLE projects ADD PRIMARY KEY (id);"

    Project.all.each do |p|
      # has_one image
      Image.find(p.old_id).update!(project: p) 
      # has_many stories
      Story.where(project_id: p.old_id).each do |s|
        s.update!(project: p)
      end
    end
  end
  ...
end
Run Code Online (Sandbox Code Playgroud)

t.remove :id由于外键约束,此迁移在尝试时中断。错误信息是:

Mysql2::Error: Cannot drop column 'id': needed in …
Run Code Online (Sandbox Code Playgroud)

mysql ruby-on-rails foreign-keys rails-migrations ruby-on-rails-5

3
推荐指数
1
解决办法
5766
查看次数

SQLAlchemy 中建模的所有关系都必须是双向的吗?

我正在学习 python 和 sqlalchemy,并对商店和语言环境之间的关系进行建模。我收到错误:

InvalidRequestError:一个或多个映射器初始化失败 - 无法继续初始化其他映射器。触发映射器:'Mapper|Shop|shop'。原始异常是:Mapper 'Mapper|Locale|locale' 没有属性 'shop'

当我尝试从数据库检索语言时。

from sqlalchemy import Column, ForeignKey, PrimaryKeyConstraint, String
from sqlalchemy.orm import relationship

    class Shop(maria.Base):
        __tablename__ = 'shop'
        __table_args__ = {'extend_existing': True }

        name = Column(String(25), primary_key=True)
        locale = Column(String, ForeignKey('locale.country'), primary_key=True)
        url = Column(String, nullable=False)

        country = relationship("Locale", back_populates='shop')

        def __repr__(self):
            return "{\n\tname:'%s',\n\tlocale:'%s',\n\turl:'%s'\n}" % (self.name, self.locale, self.url)

    class Locale(maria.Base):
        __tablename__ = 'locale'
        __table_args__ = {'extend_existing': True}

        country = Column(String(50), primary_key=True)
        code = Column(String(11), primary_key=True)

        def __repr__(self):
            return "{\n\tcountry:'%s',\n\tcode:'%s'\n}" % (self.country, …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy foreign-keys relational-database

3
推荐指数
1
解决办法
1142
查看次数

ALTER TABLE 语句与 CHECK 约束冲突

我想在两个数据库之间创建外键。碰巧这些表有数据,所以当我制作外关系时,出现了错误。

我发现当您的表有数据时会发生错误。那么如何不验证现有数据呢?

ALTER TABLE [contrato_sigob].[relacion_institucion_categoria]
ADD CONSTRAINT CHECK_CATEGORIA
CHECK([dbo].[func_CHECK_CATEGORIA](id_categoria)=1);
Run Code Online (Sandbox Code Playgroud)

错误说:

The ALTER TABLE statement conflicted with the CHECK constraint "CHECK_CATEGORIA". The conflict occurred in database "SIGOB_Contraloria", table "contrato_sigob.relacion_institucion_categoria", column 'id_categoria'.
Run Code Online (Sandbox Code Playgroud)

sql database sql-server foreign-keys

3
推荐指数
1
解决办法
3269
查看次数

如何在DRF中获取并显示父序列化器中的所有子对象

我有 3 个不同的序列化器,用于父对象和子对象的 3 个不同视图。意见是CreateAPIView,,ListAPIViewRetrieveAPIView

因此,我CreateAPIView有一个用于创建对象的序列化器,ListAPIView有一个用于列出对象的序列化器,还有RetrieveAPIView一个用于显示对象的详细信息的序列化器。对于子对象和父对象都是如此。

如何列出父对象中与其相关的所有子对象?这意味着RetrieveAPIView我想在父级中展示ListAPIView 其子级。

楷模

class Boards(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    name = models.CharField(max_length=50, blank=False, null=False, unique=True)
    slug = models.SlugField()

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Boards, self).save(*args, **kwargs)

class Lists(models.Model):

    name = models.CharField(max_length=50, blank=False, null=False, unique=True)
    slug = models.SlugField()
    board = models.ForeignKey(Boards, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Lists, …
Run Code Online (Sandbox Code Playgroud)

foreign-keys django-generic-views django-serializer django-rest-framework

3
推荐指数
1
解决办法
5115
查看次数

当相关对象被删除时,如何维护外键?

假设我有来自两个不同表的两个对象,分别称为Student、 和School。该Student表存储了该表的外键School,因此是多对一的关系。例如:

Student Obj (pk = 251)
- school_pk = 24 (Attribute can be null)

School Obj (pk = 24)
Run Code Online (Sandbox Code Playgroud)

School现在,如果我删除主键为 24 的对象会发生什么?主键为 251 的对象Student在删除过程中是否也被更新,使其属性school_pk被设置为null

database foreign-keys relational-database

3
推荐指数
1
解决办法
1674
查看次数

EF Core 2.2 - 同一个表的两个外键

我有一个与这里发布的问题类似的问题: Entity Framework Code First - Twoforeign Keys from same table,但是它非常旧,不适用于 Core,我无法得到适合我的建议。

基本上,我正在尝试创建一个固定表,其中有两个指向团队表的外键。一场比赛由主队和客队组成。拥有可为空的字段不是一种选择。

考虑一场有两支球队的比赛。

public class Fixture
{
    public int Id { get; set; }
    public Team HomeTeam { get; set; }
    public int HomeTeamId { get; set; }
    public Team AwayTeam { get; set; }
    public int AwayTeamId { get; set; }

    public virtual Team HomeTeam { get; set; }
    public virtual Team AwayTeam { get; set; }
}



public class Team
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc foreign-keys entity-framework-core

3
推荐指数
1
解决办法
8887
查看次数

外键参考复合主键

该数据库将存储有关硬件设备及其收集的数据的信息。我创建了一个设备表来存储可用的硬件设备:

CREATE TABLE IF NOT EXISTS `devices` (
  `deviceID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `deviceType` int(10) unsigned NOT NULL,
  `updateFrequency` int(10) unsigned NOT NULL,
  PRIMARY KEY (`deviceID`,`deviceType`)
)
Run Code Online (Sandbox Code Playgroud)

deviceID 将对应于真实的硬件 ID(从 1 到 12)。由于有两种类型的硬件设备,我认为创建一个 deviceType 是合适的,该 deviceType 为 0 或 1,具体取决于哪个硬件设备并创建一个复合主键。

为了存储该数据,我创建了另一个表。

CREATE TABLE IF NOT EXISTS `data` (
  `dataID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `deviceID` int(11) unsigned NOT NULL,
  `payload` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  PRIMARY KEY (`dataID`),
  KEY `fk_data_devices` (`deviceID`),
  CONSTRAINT `fk_data_devices` 
    FOREIGN KEY (`deviceID`) …
Run Code Online (Sandbox Code Playgroud)

mysql sql database-design foreign-keys mariadb

3
推荐指数
1
解决办法
850
查看次数

PostgreSQL 使用 REFERENCES 时可以省略 FOREIGN KEY 吗?

我想知道这两个 SQL 语句之间是否有任何(可能是细微的)差异:

CREATE TABLE profiles (
    profile_id SERIAL PRIMARY KEY NOT NULL,
    bio TEXT,
    user_id INTEGER NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);
Run Code Online (Sandbox Code Playgroud)

CREATE TABLE profiles (
    profile_id SERIAL PRIMARY KEY NOT NULL,
    bio TEXT,
    user_id INTEGER NOT NULL REFERENCES users(user_id) 
);
Run Code Online (Sandbox Code Playgroud)

我注意到,当我在 Postico 中使用第一个表示法创建表时,但profiles稍后查看创建的表的 DDL,它FOREIGN KEY被删除,最终得到较短的第二个表示法。

创建表FOREIGN KEY

DDL 视图不显示FOREIGN KEY

因此,我想知道(并寻求确认)这两个语句实际上 100% 等效,或者它们对数据库的作用是否存在一些细微的差异。

任何指向官方资源的指针(也许还有它与 MySQL 的不同之处)将不胜感激。

sql postgresql foreign-keys

3
推荐指数
1
解决办法
2168
查看次数

“PRAGMAforeign_keys=OFF”SQLite 语句可以在 TypeORM 迁移中使用吗?

我使用 TypeORM (v0.2.18) 和 Node.js (v12.7.0) 在 SQLite 数据库中执行迁移。

这是我的情况:我有一个名为 的表country和一个名为 的表workflow。我想删除其中一列名为 的列namecountry但通过该列进行workflow引用country

使用 SQLite 的 DB Browser,我可以使用以下语句成功删除该列:

PRAGMA foreign_keys=OFF;
CREATE TEMPORARY TABLE country_backup(id, createdAt, updatedAt, enabled, codeIso2);
INSERT INTO country_backup SELECT id, createdAt, updatedAt, enabled, codeIso2 FROM country;
DROP TABLE country;
CREATE TABLE country(id, createdAt, updatedAt, enabled, codeIso2);
INSERT INTO country SELECT id, createdAt, updatedAt, enabled, codeIso2 FROM country_backup;
DROP TABLE country_backup;
PRAGMA foreign_keys=ON;
Run Code Online (Sandbox Code Playgroud)

我在 TypeORM 迁移中使用了它,如下所示: …

sqlite foreign-keys typeorm

3
推荐指数
1
解决办法
3457
查看次数

SQLAlchemy ORM 无法使用复合外键

我正在尝试使用几个相关模型构建一个示例,如下所示。我们有一个模型 B 与模型 C 具有 1:n 关系;那么我们就有一个模型 A,与 B 具有 1 关系,与 C 具有 1 关系。(C 有 2 列主键)

我尝试了这段代码:

class C(db.Model):
    __tablename__ = 'C'
    key1 = Column(Integer, primary_key=True)
    key2 = Column(Integer, primary_key=True)
    attr1 = Column(Date)
    attr2 = Column(Boolean)
    related_b = Column(Integer, ForeignKey('B.spam'))


class B(db.Model):
    __tablename__ = 'B'
    spam = Column(Integer, default=1, primary_key=True)
    eggs = Column(String, default='eggs')
    null = Column(String)
    n_relation = relationship(C, foreign_keys='C.related_b')


class A(db.Model):
    __tablename__ = 'A'
    foo = Column(String, default='foo', primary_key=True)
    bar = Column(String, default='bar', primary_key=True)
    baz …
Run Code Online (Sandbox Code Playgroud)

python orm sqlalchemy foreign-keys relationship

3
推荐指数
1
解决办法
3638
查看次数