I want to make table field (foreign key) that can reference to one of 2 tables: Dog or Cat.
I know it may be most likely implemented in PostgreSQL (via check) keyword (not a part of SQL standard), not a foreign key).
So I suppose it may be possible at other databases also via their private syntax.
Theoretically it may be done by Sqlalchemy even if some particular database not supporting a such functionality.
in Python code it looks like this:
# # # SCHEMAS.PY # # #
from dataclasses import dataclass
@dataclass
class Cat: ...
@dataclass
class Dog: ...
@dataclass
class review:
stars_value: int
entity: Cat | Dog
comment: str
# # # MODELS.PY # # #
from sqlalchemy import Column, Table, ForeignKey, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
cats = Table(
"cats",
Base.metadata,
Column("id", Integer, primary_key=True),
Column("name", String)
)
dogs = Table(
"dogs",
Base.metadata,
Column("id", Integer, primary_key=True),
Column("name", String),
)
review = Table(
"review",
Base.metadata,
Column("id", Integer, primary_key=True),
Column("comment", String),
Column("entity", Integer, ForeignKey("cats.id" | "dogs.id") # Invalid syntax here!
)
If no - I will do it via some intermediate table as:
review_categories = Table(
"review_categories",
Base.metadata,
Column("id", Integer, primary_key=True),
Column("cat", Integer),
Column("dog Integer),
)