Alembic级联删除和升级降级顺序

问题描述 投票:0回答:1

`首先,如果我不了解 Pydentic 的工作原理,我想道歉,我是 FastAPI 和 Pydantic 的新手。

第一个问题是表的级联删除。在每个关系参数cascade =“all,delete-orphan”中添加,但是当我运行删除表的alembic升级头命令时,出现错误:

sqlalchemy.exc.InternalError: (psycopg2.errors.DependentObjectsStillExist) cannot drop table termin because other objects depend on it
DETAIL:  constraint zavrseniTermin_idTermina_fkey on table "zavrseniTermin" depends on table termin
constraint sportistaTermin_idTermina_fkey on table "sportistaTermin" depends on table termin
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

根据alembic版本文件中的删除顺序,表名和约束不同,错误是相同的。

模型文件:

from sqlalchemy import Boolean, Date, ForeignKey, Column, Text, Integer, String, Time, Float, LargeBinary
from sqlalchemy.orm import relationship
from passlib.context import CryptContext
from database.database import Base

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

class Sport(Base):
    __tablename__ = "sport"

    idSporta = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    imeSporta = Column(String,  unique=True)

    termin = relationship("Termin", back_populates="sport", cascade="all, delete-orphan")
    dostupniSportovi = relationship("DostupniSportovi", back_populates="sport", cascade="all, delete-orphan")

class RadnoVrijeme(Base):
    __tablename__ = "radnoVrijeme"

    idRadnogVremena = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    pocetak = Column(Time)
    kraj = Column(Time)

    dvorana = relationship("Dvorana", back_populates="radnoVrijeme", cascade="all, delete-orphan")

class Banka(Base):
    __tablename__ = "banka"
    
    idRacuna = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    balans = Column(Float, nullable=False)
    ziroRacun = Column(String, nullable=False, unique=True)
    pin = Column(String, nullable=False)

    user = relationship("User", back_populates="banka", cascade="all, delete-orphan")

    def verifyPin(self, pin: int):
        return pwd_context.verify(pin, self.pin)

    def getHashedPin(self, pin: int):
        return pwd_context.hash(pin)

class User(Base):
    __tablename__ = 'user'

    idUsera = Column(Integer, primary_key=True, unique=True, index=True, nullable=False)
    username = Column(String, unique=True, index=True, nullable=False)
    sifra = Column(String, nullable=False)
    rijeci = Column(String, default=None)
    verifikovan = Column(Boolean, default=False)
    mail = Column(String, unique=True, nullable=False)
    referalCode = Column(String, unique=True, default=None)
    ime = Column(String, nullable=False)
    prezime = Column(String, nullable=False)
    profilna = Column(Integer, ForeignKey('slike.idSlike'))
    spol = Column(String, nullable=False)
    godine = Column(Integer, default=None)
    opis = Column(Text, default=None)
    visina = Column(Integer, default=None)
    tezina = Column(Float, default=None)
    coins = Column(Float, default=None)
    racun = Column(Integer, ForeignKey('banka.idRacuna'), unique=True)

    banka = relationship("Banka", back_populates="user", cascade="all, delete-orphan")
    admin = relationship("Admin", back_populates="user", cascade="all, delete-orphan")
    vlasnik = relationship("Vlasnik", back_populates="user", cascade="all, delete-orphan")
    sportista = relationship("Sportista", back_populates="user", cascade="all, delete-orphan")

    prijateljstvaUser1 = relationship("Prijateljstva", foreign_keys="Prijateljstva.idUser1", back_populates="user1", overlaps="prijateljstvaUser1", cascade="all, delete-orphan")
    prijateljstvaUser2 = relationship("Prijateljstva", foreign_keys="Prijateljstva.idUser2", back_populates="user2", overlaps="prijateljstvaUser2", cascade="all, delete-orphan")

    slika = relationship("Slike", back_populates="profilna", cascade="all, delete-orphan")

    def verifyPassword(self, password: str):
        return pwd_context.verify(password, self.sifra)

    def getHashedPassword(self, password: str):
        return pwd_context.hash(password)   

class Admin(Base):
    __tablename__ = "admin"

    idAdmina = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    idUsera = Column(Integer, ForeignKey('user.idUsera'))  

    user = relationship("User", back_populates="admin", cascade="all, delete-orphan")

class Vlasnik(Base):
    __tablename__ = "vlasnik"

    idVlasnika = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    idUsera = Column(Integer, ForeignKey('user.idUsera'))  
    kontakt = Column(String)

    user = relationship("User", back_populates="vlasnik", cascade="all, delete-orphan")
    posjedovanje = relationship("Posjedovanje", back_populates="vlasnik", cascade="all, delete-orphan")

class Sportista(Base):
    __tablename__ = "sportista"

    idSportiste = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    idUsera = Column(Integer, ForeignKey('user.idUsera'))  
    iskustvo = Column(String)
    dostupnost = Column(Boolean)

    sportistaTermin = relationship("SportistaTermin", back_populates="sportista", cascade="all, delete-orphan")
    user = relationship("User", back_populates="sportista", cascade="all, delete-orphan")

class Prijateljstva(Base):
    __tablename__ = "prijateljstva"

    idPrijateljstva = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    idUser1 = Column(Integer, ForeignKey('user.idUsera'))
    idUser2 = Column(Integer, ForeignKey('user.idUsera'))

    user1 = relationship("User", foreign_keys=[idUser1], back_populates="prijateljstvaUser1", overlaps="prijateljstvaUser1", cascade="all, delete-orphan")
    user2 = relationship("User", foreign_keys=[idUser2], back_populates="prijateljstvaUser2", overlaps="prijateljstvaUser2", cascade="all, delete-orphan")

class Dvorana(Base):
    __tablename__ = "dvorana"

    idDvorane = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    otvoreno = Column(Integer, ForeignKey('radnoVrijeme.idRadnogVremena')) 
    lokacija = Column(String)
    slika = Column(Integer, ForeignKey('slike.idSlike'))
    pocetnaCijena = Column(Float)
    ocjena = Column(Float)
    brojOcjena = Column(Integer)

    radnoVrijeme = relationship("RadnoVrijeme", back_populates="dvorana", cascade="all, delete-orphan")
    posjedovanje = relationship("Posjedovanje", back_populates="dvorana", cascade="all, delete-orphan")
    termin = relationship("Termin", back_populates="dvorana", cascade="all, delete-orphan")
    dostupnost = relationship("Dostupnost", back_populates="dvorana", cascade="all, delete-orphan")
    turnir = relationship("Turnir", back_populates="dvorana", cascade="all, delete-orphan")
    dostupniSportovi = relationship("DostupniSportovi", back_populates="dvorana", cascade="all, delete-orphan")

    izgled = relationship("Slike", back_populates="slika_dvorane", cascade="all, delete-orphan")

class Posjedovanje(Base):
    __tablename__ = "posjedovanje"

    idPosjeda = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    idVlasnika = Column(Integer, ForeignKey('vlasnik.idVlasnika'))  
    idDvorane = Column(Integer, ForeignKey('dvorana.idDvorane'))  

    vlasnik = relationship("Vlasnik", back_populates="posjedovanje")
    dvorana = relationship("Dvorana", back_populates="posjedovanje")

class Turnir(Base):
    __tablename__ = "turnir"

    idTurnira = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    idDvorane = Column(Integer, ForeignKey('dvorana.idDvorane'))  
    ekipa = Column(String)
    velicina = Column(Integer)

    dvorana = relationship("Dvorana", back_populates="turnir", cascade="all, delete-orphan")

class Dostupnost(Base):
    __tablename__ = "dostupnost"

    idDostupnosti = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    idDvorane = Column(Integer, ForeignKey('dvorana.idDvorane'))  
    datum = Column(Date)
    odKad = Column(Time)
    doKad = Column(Time)
    statusDostupnosti = Column(Boolean)

    dvorana = relationship("Dvorana", back_populates="dostupnost", cascade="all, delete-orphan")

class DostupniSportovi(Base):
    __tablename__ = "dostupniSportovi"

    idDostupnogSporta = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    idDvorane = Column(Integer, ForeignKey('dvorana.idDvorane'))  
    idSporta = Column(Integer, ForeignKey('sport.idSporta'))  

    sport = relationship("Sport", back_populates="dostupniSportovi", cascade="all, delete-orphan")
    dvorana = relationship("Dvorana", back_populates="dostupniSportovi", cascade="all, delete-orphan")

class Termin(Base):
    __tablename__ = "termin"

    idTermina = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    idSporta = Column(Integer, ForeignKey('sport.idSporta'))  
    idDvorane = Column(Integer, ForeignKey('dvorana.idDvorane'))  
    konacnaCijena = Column(Float)
    potrebno = Column(Integer)
    datum = Column(Date)
    sati = Column(Time)
    promoCode = Column(String, default=None)

    sport = relationship("Sport", back_populates="termin", cascade="all, delete-orphan")
    sportistaTermin = relationship("SportistaTermin", back_populates="termin", cascade="all, delete-orphan")
    zavrseniTermin = relationship("ZavrseniTermin", back_populates="termin", cascade="all, delete-orphan")
    dvorana = relationship("Dvorana", back_populates="termin", cascade="all, delete-orphan")

class ZavrseniTermin(Base):
    __tablename__ = "zavrseniTermin"

    idZavrsenogTermina = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    idTermina = Column(Integer, ForeignKey('termin.idTermina'))  
    ocjena = Column(Float)

    termin = relationship("Termin", back_populates="zavrseniTermin", cascade="all, delete-orphan")

class SportistaTermin(Base):
    __tablename__ = "sportistaTermin"

    idSportistaTermin = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    idTermina = Column(Integer, ForeignKey('termin.idTermina'))  
    idSportiste = Column(Integer, ForeignKey('sportista.idSportiste'))  
    statusTermina = Column(String)

    termin = relationship("Termin", back_populates="sportistaTermin", cascade="all, delete-orphan")
    sportista = relationship("Sportista", back_populates="sportistaTermin", cascade="all, delete-orphan")

class Slike(Base):
    __tablename__ = "slike"

    idSlike = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    slika = Column(LargeBinary)

    profilna = relationship("User", back_populates="slika", cascade="all, delete-orphan")
    slika_dvorane = relationship("Dvorana", back_populates="izgled", cascade="all, delete-orphan")

第二个问题是升级和降级功能的顺序。首先,当数据库为空时,我运行了 alembic revision --autogenerate -m "prazna" 命令,它运行并在 alembic 版本文件夹中创建了一个文件,代码如下:

"""prazna

Revision ID: cebf6dd2e8e4
Revises: 
Create Date: 2024-04-25 14:42:00.696612

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = 'cebf6dd2e8e4'
down_revision: Union[str, None] = None
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    pass
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    pass
    # ### end Alembic commands ###

之后我运行了alembic升级头,它在数据库中创建了alembic表,其中包含行ID文本,之后我启动了服务器,模型文件在数据库中创建了表。之后我运行

alembic revision --autogenerate -m "kreirana"
命令创建了一个新的 alembic 版本文件:

"""kreirana

Revision ID: 45512bf01ead
Revises: cebf6dd2e8e4
Create Date: 2024-04-25 14:44:18.787147

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision: str = '45512bf01ead'
down_revision: Union[str, None] = 'cebf6dd2e8e4'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('posjedovanje')
    op.drop_table('turnir')
    op.drop_table('termin')
    op.drop_table('admin')
    op.drop_table('dvorana')
    op.drop_table('sportistaTermin')
    op.drop_index('ix_user_idUsera', table_name='user')
    op.drop_index('ix_user_username', table_name='user')
    op.drop_table('user')
    op.drop_table('dostupniSportovi')
    op.drop_table('slike')
    op.drop_table('sportista')
    op.drop_table('zavrseniTermin')
    op.drop_table('sport')
    op.drop_table('prijateljstva')
    op.drop_table('vlasnik')
    op.drop_table('dostupnost')
    op.drop_table('banka')
    op.drop_table('radnoVrijeme')
    # ### end Alembic commands ###

def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('radnoVrijeme',
    sa.Column('idRadnogVremena', sa.INTEGER(), server_default=sa.text('nextval(\'"radnoVrijeme_idRadnogVremena_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('pocetak', postgresql.TIME(), autoincrement=False, nullable=True),
    sa.Column('kraj', postgresql.TIME(), autoincrement=False, nullable=True),
    sa.PrimaryKeyConstraint('idRadnogVremena', name='radnoVrijeme_pkey'),
    postgresql_ignore_search_path=False
    )
    op.create_table('banka',
    sa.Column('idRacuna', sa.INTEGER(), server_default=sa.text('nextval(\'"banka_idRacuna_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('balans', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=False),
    sa.Column('ziroRacun', sa.VARCHAR(), autoincrement=False, nullable=False),
    sa.Column('pin', sa.VARCHAR(), autoincrement=False, nullable=False),
    sa.PrimaryKeyConstraint('idRacuna', name='banka_pkey'),
    sa.UniqueConstraint('ziroRacun', name='banka_ziroRacun_key'),
    postgresql_ignore_search_path=False
    )
    op.create_table('dostupnost',
    sa.Column('idDostupnosti', sa.INTEGER(), server_default=sa.text('nextval(\'"dostupnost_idDostupnosti_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('idDvorane', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('datum', sa.DATE(), autoincrement=False, nullable=True),
    sa.Column('odKad', postgresql.TIME(), autoincrement=False, nullable=True),
    sa.Column('doKad', postgresql.TIME(), autoincrement=False, nullable=True),
    sa.Column('statusDostupnosti', sa.BOOLEAN(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['idDvorane'], ['dvorana.idDvorane'], name='dostupnost_idDvorane_fkey'),
    sa.PrimaryKeyConstraint('idDostupnosti', name='dostupnost_pkey')
    )
    op.create_table('vlasnik',
    sa.Column('idVlasnika', sa.INTEGER(), server_default=sa.text('nextval(\'"vlasnik_idVlasnika_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('idUsera', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('kontakt', sa.VARCHAR(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['idUsera'], ['user.idUsera'], name='vlasnik_idUsera_fkey'),
    sa.PrimaryKeyConstraint('idVlasnika', name='vlasnik_pkey'),
    postgresql_ignore_search_path=False
    )
    op.create_table('prijateljstva',
    sa.Column('idPrijateljstva', sa.INTEGER(),       server_default=sa.text('nextval(\'"prijateljstva_idPrijateljstva_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('idUser1', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('idUser2', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['idUser1'], ['user.idUsera'], name='prijateljstva_idUser1_fkey'),
    sa.ForeignKeyConstraint(['idUser2'], ['user.idUsera'], name='prijateljstva_idUser2_fkey'),
    sa.PrimaryKeyConstraint('idPrijateljstva', name='prijateljstva_pkey')
    )
    op.create_table('sport',
    sa.Column('idSporta', sa.INTEGER(), server_default=sa.text('nextval(\'"sport_idSporta_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('imeSporta', sa.VARCHAR(), autoincrement=False, nullable=True),
    sa.PrimaryKeyConstraint('idSporta', name='sport_pkey'),
    sa.UniqueConstraint('imeSporta', name='sport_imeSporta_key'),
    postgresql_ignore_search_path=False
    )
    op.create_table('zavrseniTermin',
    sa.Column('idZavrsenogTermina', sa.INTEGER(), server_default=sa.text('nextval(\'"zavrseniTermin_idZavrsenogTermina_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('idTermina', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('ocjena', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['idTermina'], ['termin.idTermina'], name='zavrseniTermin_idTermina_fkey'),
    sa.PrimaryKeyConstraint('idZavrsenogTermina', name='zavrseniTermin_pkey')
    )
    op.create_table('sportista',
    sa.Column('idSportiste', sa.INTEGER(), server_default=sa.text('nextval(\'"sportista_idSportiste_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('idUsera', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('iskustvo', sa.VARCHAR(), autoincrement=False, nullable=True),
    sa.Column('dostupnost', sa.BOOLEAN(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['idUsera'], ['user.idUsera'], name='sportista_idUsera_fkey'),
    sa.PrimaryKeyConstraint('idSportiste', name='sportista_pkey'),
    postgresql_ignore_search_path=False
    )
    op.create_table('slike',
    sa.Column('idSlike', sa.INTEGER(), server_default=sa.text('nextval(\'"slike_idSlike_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('slika', postgresql.BYTEA(), autoincrement=False, nullable=True),
    sa.PrimaryKeyConstraint('idSlike', name='slike_pkey'),
    postgresql_ignore_search_path=False
    )
    op.create_table('dostupniSportovi',
    sa.Column('idDostupnogSporta', sa.INTEGER(), server_default=sa.text('nextval(\'"dostupniSportovi_idDostupnogSporta_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('idDvorane', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('idSporta', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['idDvorane'], ['dvorana.idDvorane'], name='dostupniSportovi_idDvorane_fkey'),
    sa.ForeignKeyConstraint(['idSporta'], ['sport.idSporta'], name='dostupniSportovi_idSporta_fkey'),
    sa.PrimaryKeyConstraint('idDostupnogSporta', name='dostupniSportovi_pkey')
    )
    op.create_table('user',
    sa.Column('idUsera', sa.INTEGER(), server_default=sa.text('nextval(\'"user_idUsera_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('username', sa.VARCHAR(), autoincrement=False, nullable=False),
    sa.Column('sifra', sa.VARCHAR(), autoincrement=False, nullable=False),
    sa.Column('rijeci', sa.VARCHAR(), autoincrement=False, nullable=True),
    sa.Column('verifikovan', sa.BOOLEAN(), autoincrement=False, nullable=True),
    sa.Column('mail', sa.VARCHAR(), autoincrement=False, nullable=False),
    sa.Column('referalCode', sa.VARCHAR(), autoincrement=False, nullable=True),
    sa.Column('ime', sa.VARCHAR(), autoincrement=False, nullable=False),
    sa.Column('prezime', sa.VARCHAR(), autoincrement=False, nullable=False),
    sa.Column('profilna', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('spol', sa.VARCHAR(), autoincrement=False, nullable=False),
    sa.Column('godine', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('opis', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('visina', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('tezina', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('coins', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('racun', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['profilna'], ['slike.idSlike'], name='user_profilna_fkey'),
    sa.ForeignKeyConstraint(['racun'], ['banka.idRacuna'], name='user_racun_fkey'),
    sa.PrimaryKeyConstraint('idUsera', name='user_pkey'),
    sa.UniqueConstraint('mail', name='user_mail_key'),
    sa.UniqueConstraint('racun', name='user_racun_key'),
    sa.UniqueConstraint('referalCode', name='user_referalCode_key'),
    postgresql_ignore_search_path=False
    )
    op.create_index('ix_user_username', 'user', ['username'], unique=True)
    op.create_index('ix_user_idUsera', 'user', ['idUsera'], unique=True)
    op.create_table('sportistaTermin',
    sa.Column('idSportistaTermin', sa.INTEGER(), server_default=sa.text('nextval(\'"sportistaTermin_idSportistaTermin_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('idTermina', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('idSportiste', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('statusTermina', sa.VARCHAR(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['idSportiste'], ['sportista.idSportiste'], name='sportistaTermin_idSportiste_fkey'),
    sa.ForeignKeyConstraint(['idTermina'], ['termin.idTermina'], name='sportistaTermin_idTermina_fkey'),
    sa.PrimaryKeyConstraint('idSportistaTermin', name='sportistaTermin_pkey')
    )
    op.create_table('dvorana',
    sa.Column('idDvorane', sa.INTEGER(), server_default=sa.text('nextval(\'"dvorana_idDvorane_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('otvoreno', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('lokacija', sa.VARCHAR(), autoincrement=False, nullable=True),
    sa.Column('slika', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('pocetnaCijena', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('ocjena', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('brojOcjena', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['otvoreno'], ['radnoVrijeme.idRadnogVremena'], name='dvorana_otvoreno_fkey'),
    sa.ForeignKeyConstraint(['slika'], ['slike.idSlike'], name='dvorana_slika_fkey'),
    sa.PrimaryKeyConstraint('idDvorane', name='dvorana_pkey'),
    postgresql_ignore_search_path=False
    )
    op.create_table('admin',
    sa.Column('idAdmina', sa.INTEGER(), server_default=sa.text('nextval(\'"admin_idAdmina_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('idUsera', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['idUsera'], ['user.idUsera'], name='admin_idUsera_fkey'),
    sa.PrimaryKeyConstraint('idAdmina', name='admin_pkey')
    )
    op.create_table('termin',
    sa.Column('idTermina', sa.INTEGER(), server_default=sa.text('nextval(\'"termin_idTermina_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('idSporta', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('idDvorane', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('konacnaCijena', sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True),
    sa.Column('potrebno', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('datum', sa.DATE(), autoincrement=False, nullable=True),
    sa.Column('sati', postgresql.TIME(), autoincrement=False, nullable=True),
    sa.Column('promoCode', sa.VARCHAR(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['idDvorane'], ['dvorana.idDvorane'], name='termin_idDvorane_fkey'),
    sa.ForeignKeyConstraint(['idSporta'], ['sport.idSporta'], name='termin_idSporta_fkey'),
    sa.PrimaryKeyConstraint('idTermina', name='termin_pkey')
    )
    op.create_table('turnir',
    sa.Column('idTurnira', sa.INTEGER(), server_default=sa.text('nextval(\'"turnir_idTurnira_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('idDvorane', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('ekipa', sa.VARCHAR(), autoincrement=False, nullable=True),
    sa.Column('velicina', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['idDvorane'], ['dvorana.idDvorane'], name='turnir_idDvorane_fkey'),
    sa.PrimaryKeyConstraint('idTurnira', name='turnir_pkey')
    )
    op.create_table('posjedovanje',
    sa.Column('idPosjeda', sa.INTEGER(), server_default=sa.text('nextval(\'"posjedovanje_idPosjeda_seq"\'::regclass)'), autoincrement=True, nullable=False),
    sa.Column('idVlasnika', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('idDvorane', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.ForeignKeyConstraint(['idDvorane'], ['dvorana.idDvorane'], name='posjedovanje_idDvorane_fkey'),
    sa.ForeignKeyConstraint(['idVlasnika'], ['vlasnik.idVlasnika'], name='posjedovanje_idVlasnika_fkey'),
    sa.PrimaryKeyConstraint('idPosjeda', name='posjedovanje_pkey')
    )
    # ### end Alembic commands ###

也许我理解错误,但是创建表应该在升级功能中,删除表应该在降级功能中吗?

如果重要的话版本是:

alembic==1.13.1
fastapi==0.110.0
SQLAlchemy==2.0.28
uvicorn==0.28.0
Python 3.12.3

我正在使用 PostgreSQL 数据库

项目文件夹架构

我输入将参数cascade =“all,delete-orphan”替换为cascade =“all,delete”,但它不起作用。我还尝试在创建外键的地方添加 ondelete="CASCADE" 参数,也不起作用。`

python postgresql fastapi cascade alembic
1个回答
0
投票

您必须修改

env.py
(在
alembic
文件夹内)文件如下:

from database.database import Base
## you also have to import all the models which inherit from Base
from src.models import *

/* generated code here */

target_metadata = Base.metadata

/* generated code here */

这将根据您的模型创建或修改您的表(如果声明正确,请检查docs

© www.soinside.com 2019 - 2024. All rights reserved.