Create a SessionLocal class ¶Įach instance of the SessionLocal class will be a database session. ![]() ![]() This is to prevent accidentally sharing the same connection for different things (for different requests).īut in FastAPI, using normal functions ( def) more than one thread could interact with the database for the same request, so we need to make SQLite know that it should allow that with connect_args=.Īlso, we will make sure each request gets its own database connection session in a dependency, so there's no need for that default mechanism. In a similar way you could use any other ORM.īy default SQLite will only allow one thread to communicate with it, assuming that each thread would handle an independent request. Here we will see how to work with SQLAlchemy ORM. So, orion_ could be the name (from the name column in the owners table) of this pet's owner.Īnd the ORM will do all the work to get the information from the corresponding table owners when you try to access it from your pet object.Ĭommon ORMs are for example: Django-ORM (part of the Django framework), SQLAlchemy ORM (part of SQLAlchemy, independent of framework) and Peewee (independent of framework), among others. This way, you could also have an attribute orion_cat.owner and the owner would contain the data for this pet's owner, taken from the table owners. These ORMs also have tools to make the connections or relations between tables or entities. And the value of that attribute could be, e.g. With an ORM, you normally create a class that represents a table in a SQL database, each attribute of the class represents a column, with a name and a type.įor example a class Pet could represent a SQL table pets.Īnd each instance object of that class represents a row in the database.įor example an object orion_cat (an instance of Pet) could have an attribute orion_cat.type, for the column type. ORMs ¶įastAPI works with any database and any style of library to talk to the database.Ī common pattern is to use an "ORM": an "object-relational mapping" library.Īn ORM has tools to convert (" map") between objects in code and database tables (" relations"). The FastAPI specific code is as small as always. Notice that most of the code is the standard SQLAlchemy code you would use with any framework. Let’s say this is your models.py file and you want to change the amount column from String to Numeric.OAuth2 with Password (and hashing), Bearer with JWT tokensĬreate SQLAlchemy models from the Base classĬreate Pydantic models / schemas for reading / returning So let’s get our hands dirty.Ĭheck out this explanation of why we should use numeric data type to store monetary value instead of float or integer. The thing is, when you add or remove columns on your database using SQL alchemy, it uses alembic as the engine to write the migrations files but alembic doesn’t recognize altering data types for a column, or at least doesn’t at the time of writing this article. Fortunately we could replace that column as we’re just in dev environment and could afford loosing on data but if you can’t, there is an easier way and the reason why I’m writing this is because there isn’t much documentation on using Postgres’ USING clause in alembic and I had to scour the internet to find something that would work. ![]() ![]() We had two options either to replace that column with a new column with same name and a decimal data type or to alter the table. Recently I came across a scenario where we had to alter a column type of a column from char to a decimal.įor some reason, previous developer had used a character type for a storing money.
0 Comments
Leave a Reply. |
AuthorWrite something about yourself. No need to be fancy, just an overview. ArchivesCategories |