-
-
Notifications
You must be signed in to change notification settings - Fork 811
Closed
Labels
Description
First Check
- I added a very descriptive title to this issue.
- I used the GitHub search to find a similar issue and didn't find it.
- I searched the SQLModel documentation, with the integrated search.
- I already searched in Google "How to X in SQLModel" and didn't find any information.
- I already read and followed all the tutorial in the docs and didn't find an answer.
- I already checked if it is not related to SQLModel but to Pydantic.
- I already checked if it is not related to SQLModel but to SQLAlchemy.
Commit to Help
- I commit to help with one of those options 👆
Example Code
# using code from - https://sqlmodel.tiangolo.com/tutorial/fastapi/multiple-models/?h=hero#the-herocreate-data-model
from typing import List, Optional
from fastapi import FastAPI
from sqlmodel import Field, Session, SQLModel, create_engine, select
class HeroBase(SQLModel):
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
class Hero(HeroBase, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
class HeroCreate(HeroBase):
pass
class HeroRead(HeroBase):
id: int
engine = create_engine(
"postgresql+psycopg2://postgres:postgres@localhost/testing", echo=True
)
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
app = FastAPI()
@app.on_event("startup")
def on_startup():
create_db_and_tables()
@app.post("/heroes/", response_model=HeroRead)
def create_hero(hero: HeroCreate):
with Session(engine) as session:
db_hero = Hero.from_orm(hero)
session.add(db_hero)
session.commit()
session.refresh(db_hero)
return db_hero
@app.get("/heroes/", response_model=List[HeroRead])
def read_heroes():
with Session(engine) as session:
heroes = session.exec(select(Hero)).all()
return heroesDescription
First attempt fails with.
sqlalchemy.exc.InvalidRequestError: Table 'hero' is already defined for this MetaData instance. Specify 'extend_existing=True' to redefine options and columns on an existing Table object.Adding this fixes this problem, however reading various sites this is not recommended?
class Hero(HeroBase, table=True):
__table_args__ = {"extend_existing": True} # < new
id: Optional[int] = Field(default=None, primary_key=True)Second attempt fails with.
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.DuplicateTable) relation "ix_hero_name" already exists
[SQL: CREATE INDEX ix_hero_name ON hero (name)]Moving the create_db_and_tables() out of the functions startup event fixes this problem and everything works as expected
create_db_and_tables()
@app.on_event("startup")
def on_startup():
print("startup")
# create_db_and_tables()Am I missing something that is causing this behavior?
Operating System
Linux
Operating System Details
No response
SQLModel Version
0.0.6
Python Version
3.10.4
Additional Context
No response
Reactions are currently unavailable