You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
In sql model documentation I saw an example of session.refresh() but when I am trying to implement this in my fastapi project this not working and raise exception that is could not refresh instance and also I am trying to print item.id, this is not also working, raise exception that is expired.
Operating System
Linux
Operating System Details
No response
SQLModel Version
0.0.8
Python Version
3.10.6
Additional Context
raise sa_exc.InvalidRequestError(
sqlalchemy.exc.InvalidRequestError: Could not refresh instance '<Server at 0x7f69b549f500>'
You cannot refresh the item because there is no database instance connected with it.
To do that you need to retrieve the item from the database using an select statement.
You can use refresh in the following:
retrieve a instance from the database hero = session.get(Hero, {'name': 'Hans'}) or a select statement
change attributes hero.age=42
add to session session.add(hero)
write changes session.commit()
refresh the instance collected from 1.session.refresh(hero)
I'm running into this problem myself as well. Pardon my ignorance, but shouldn't SQLModel do this for us? Or is this just something that must be done when using MySQL (assuming this isn't a problem for other DB types)?
As it turns out, the object I was passing to the REST endpoint had an ID specified (the ID was 0). When I either don't specify an ID or set it to None prior to adding/committing/refreshing then everything works as desired.
def add_server(item):
with Session(engine) as session:
if item.id == 0:
item.id = None
session.add(item)
session.commit()
session.refresh(item) # now refreshes properly!
return item
Although... again... shouldn't SQLModel (or FastAPI?) determine that since default=None is specified that it pass id=None inside the /docs endpoint? Right now, it passes id=0 for the primary key when I assumed it would've passed id=None...
Depends on what the default value in the Item schema is, whether 0 or None. However, we shouldn't be having to do this. Using an if condition to check for an id that is passed from a request seems like hacky fix to this problem. If the id is set as the primary key in the models it should be auto incremented by the orm.
I also have this (or, rather, a similar) issue. But in my case I do have both defaults that are not none, and a record with the same primary key in DB.
Code that doesn't work (right now at least)
Models
importuuidimportpydanticfromsqlmodelimportField, Relationship, SQLModelfrom .facultyimportFacultyModelclassCreateDepartment(SQLModel):
name: str=Field(unique=True, index=True)
description: str|None=Field(default=None, nullable=True)
classDepartmentRepresentation(BaseDepartment):
department_id: pydantic.UUID4faculties: list[FacultyModel]
classDepartmentModel(BaseDepartment, table=True):
""" Describes a department in an educational institution. Highest level of organization in an educational institution. Departments have a list of associated faculties. """department_id: pydantic.UUID4=Field(
default_factory=uuid.uuid4,
primary_key=True,
index=True,
)
faculties: list[FacultyModel] =Relationship(back_populates="department")
Basically - it takes in the model for a department, and spits out it's representation from the database by performing an update.
I'm using model validation to convert input to the DB model, and set the foreign key to the one specified in path. department_exists just verifies that specified department_id is valid and is present in the DB
@makisukurisu, your issue is different from the issue above.
You are trying to update the existing item, but use session.add. You should either use approach with update(entity_class).where() or use db.get() to fetch the object that you can then update and commit.
Activity
AshikurRahman-sec commentedon Jan 25, 2023
database is mysql
JeseYe commentedon Feb 2, 2023
del session.refresh(item)
add session.flush()
maybe work
AshikurRahman-sec commentedon Feb 6, 2023
@JeseYe thanks but I want to know why session.refresh not refresh item.
fishfacegit commentedon Apr 3, 2023
You cannot refresh the item because there is no database instance connected with it.
To do that you need to retrieve the item from the database using an select statement.
You can use refresh in the following:
hero = session.get(Hero, {'name': 'Hans'})or a select statementhero.age=42session.add(hero)session.commit()session.refresh(hero)starryknight64 commentedon Dec 27, 2023
I'm running into this problem myself as well. Pardon my ignorance, but shouldn't SQLModel do this for us? Or is this just something that must be done when using MySQL (assuming this isn't a problem for other DB types)?
starryknight64 commentedon Dec 27, 2023
I discovered a solution for this:
As it turns out, the object I was passing to the REST endpoint had an ID specified (the ID was 0). When I either don't specify an ID or set it to None prior to adding/committing/refreshing then everything works as desired.
starryknight64 commentedon Dec 27, 2023
Although... again... shouldn't SQLModel (or FastAPI?) determine that since
default=Noneis specified that it passid=Noneinside the/docsendpoint? Right now, it passesid=0for the primary key when I assumed it would've passedid=None...thebirdgr commentedon Feb 26, 2024
Depends on what the default value in the Item schema is, whether 0 or None. However, we shouldn't be having to do this. Using an if condition to check for an id that is passed from a request seems like hacky fix to this problem. If the id is set as the primary key in the models it should be auto incremented by the orm.
makisukurisu commentedon Mar 19, 2024
I also have this (or, rather, a similar) issue. But in my case I do have both defaults that are not none, and a record with the same primary key in DB.
Code that doesn't work (right now at least)
Models
Endpoint
Code sample:
Basically - it takes in the model for a department, and spits out it's representation from the database by performing an update.
I'm using model validation to convert input to the DB model, and set the foreign key to the one specified in path.
department_existsjust verifies that specifieddepartment_idis valid and is present in the DBUpdate call
Error
I get exception
InvalidRequestErrorthat looks like this:There's a lengthy INSERT SQL query, which is performed in
db.commit()line. Which is expected, I guess, but not helpful in this case.Code that does work (right now)
Update the
update_entityand call to it by adding primary_key parameter. In my case it'sdepartment_id, and the method now looks like this:Right now I see this as my only solution, but if you have different ideas, please, let me (or, rather - us) know.
P.S. Just using refresh won't do, since then you will get an error that this object is not in registry yet.
Thanks!
Additional info
I'm using sqlmodel 0.0.16, the latest version at the moment of writing this comment.
AbirAbbas commentedon Jun 19, 2024
had a similar issue, setting auto_increment=True on primary_key id solved it
YuriiMotov commentedon Aug 6, 2025
The code example from the initial post seems to work well. I can't reproduce the issue.
YuriiMotov commentedon Aug 6, 2025
@makisukurisu, your issue is different from the issue above.
You are trying to update the existing item, but use
session.add. You should either use approach withupdate(entity_class).where()or usedb.get()to fetch the object that you can then update and commit.