Repository files navigation

image

FastAPI-SQLAlchemy provides a simple integration between FastAPI and SQLAlchemy in your application. It gives access to useful helpers to facilitate the completion of common tasks.

Installing

Install and update using pip:

$ pip install fastapi-sqlalchemy

Examples

Models definition

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportDeclarativeMeta, declarative_base, sessionmakerfromfastapi_sqlalchemyimportSQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
#Define User classclassUser(db.Base):
__tablename__="items"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfrommodelsimportUser, dbfrompydanticimportBaseModelfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
# Add SQLAlchemy session middleware to manage database sessionsapp.add_middleware(DBSessionMiddleware, db=db)
# Endpoint to retrieve all users@app.get("/users")defget_users():
""" Retrieve a list of all users. Returns: List[User]: A list of User objects. """returnUser.query.all()
# Pydantic model for creating new usersclassUserCreate(BaseModel):
name: stremail: str# Endpoint to add a new user@app.post("/add_user")defadd_user(user_data: UserCreate):
""" Add a new user to the database. Args: user_data (UserCreate): User data including name and email. Returns: dict: A message indicating the success of the operation. """user=User(**user_data.model_dump())
print(user)
user.save()
return {"message": "User created successfully"}

You can initialize the SQLAlchemy() class similar to the way flask-sqlalchemy, this allows for multiple database connections to work at the same time.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfrommodelsimportUser, dbfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=User.query.count()
user_count=UserCount(user_count)
user_count.save()
# no longer able to access a database session once the db() context manager has endedreturnusers

Custom Model Base

You can define custom BaseModels, or extend the built in ModelBase to provide extended shared functionality for you database models.

importinspectfromtypingimportListfromsqlalchemyimportColumnfromfastapi_sqlalchemyimportModelBaseclassBaseModel(ModelBase):
@classmethoddefnew(cls, **kwargs):
obj=cls(**kwargs)
obj.save()
returnobj@classmethoddefget(cls, **kwargs):
result: cls=cls.query.filter_by(**kwargs).first()
returnresult@classmethoddefget_all(cls, **kwargs):
result: List[cls] =cls.query.filter_by(**kwargs).all()
returnresultdefupdate(self, **kwargs):
forcolumn, valueinkwargs.items():
setattr(self, column, value)
self.save()
returnself

As you can see the above BaseModel class adds support for various common functions and operations.

Complete examples

Legacy Examples

Models definition

Note the only change that you need to make is to add the db.Base inheritance to each of your model classes

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportdeclarative_base, sessionmakerfromfastapi_sqlalchemyimportModelBase, SQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
# Define the User class representing the "users" database table# Using the SQLAlchemy Base property instead of defining your own# And inheriting from the BaseModel class for type hinting and helpful builtin methods and propertiesclassUser(ModelBase, db.Base):
__tablename__="users"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfromfastapi_sqlalchemyimportDBSessionMiddleware# middleware helperfromfastapi_sqlalchemyimportdb# an object to provide global access to a database sessionfromapp.modelsimportUserapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
# once the middleware is applied, any route can then access the database session # from the global ``db``@app.get("/users")defget_users():
users=db.session.query(User).all()
returnusers

Note that the session object provided by db.session is based on the Python3.7+ ContextVar. This means that each session is linked to the individual request context in which it was created.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfromfastapi_sqlalchemyimportdbfromapp.modelsimportUser, UserCountapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=db.session.query(User).count()
db.session.add(UserCount(user_count))
db.session.commit()
# no longer able to access a database session once the db() context manager has endedreturnusers

About

Adds simple SQLAlchemy support to FastAPI

Resources

Stars

755 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

image

FastAPI-SQLAlchemy provides a simple integration between FastAPI and SQLAlchemy in your application. It gives access to useful helpers to facilitate the completion of common tasks.

Installing

Install and update using pip:

$ pip install fastapi-sqlalchemy

Examples

Models definition

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportDeclarativeMeta, declarative_base, sessionmakerfromfastapi_sqlalchemyimportSQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
#Define User classclassUser(db.Base):
__tablename__="items"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfrommodelsimportUser, dbfrompydanticimportBaseModelfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
# Add SQLAlchemy session middleware to manage database sessionsapp.add_middleware(DBSessionMiddleware, db=db)
# Endpoint to retrieve all users@app.get("/users")defget_users():
""" Retrieve a list of all users. Returns: List[User]: A list of User objects. """returnUser.query.all()
# Pydantic model for creating new usersclassUserCreate(BaseModel):
name: stremail: str# Endpoint to add a new user@app.post("/add_user")defadd_user(user_data: UserCreate):
""" Add a new user to the database. Args: user_data (UserCreate): User data including name and email. Returns: dict: A message indicating the success of the operation. """user=User(**user_data.model_dump())
print(user)
user.save()
return {"message": "User created successfully"}

You can initialize the SQLAlchemy() class similar to the way flask-sqlalchemy, this allows for multiple database connections to work at the same time.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfrommodelsimportUser, dbfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=User.query.count()
user_count=UserCount(user_count)
user_count.save()
# no longer able to access a database session once the db() context manager has endedreturnusers

Custom Model Base

You can define custom BaseModels, or extend the built in ModelBase to provide extended shared functionality for you database models.

importinspectfromtypingimportListfromsqlalchemyimportColumnfromfastapi_sqlalchemyimportModelBaseclassBaseModel(ModelBase):
@classmethoddefnew(cls, **kwargs):
obj=cls(**kwargs)
obj.save()
returnobj@classmethoddefget(cls, **kwargs):
result: cls=cls.query.filter_by(**kwargs).first()
returnresult@classmethoddefget_all(cls, **kwargs):
result: List[cls] =cls.query.filter_by(**kwargs).all()
returnresultdefupdate(self, **kwargs):
forcolumn, valueinkwargs.items():
setattr(self, column, value)
self.save()
returnself

As you can see the above BaseModel class adds support for various common functions and operations.

Complete examples

Legacy Examples

Models definition

Note the only change that you need to make is to add the db.Base inheritance to each of your model classes

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportdeclarative_base, sessionmakerfromfastapi_sqlalchemyimportModelBase, SQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
# Define the User class representing the "users" database table# Using the SQLAlchemy Base property instead of defining your own# And inheriting from the BaseModel class for type hinting and helpful builtin methods and propertiesclassUser(ModelBase, db.Base):
__tablename__="users"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfromfastapi_sqlalchemyimportDBSessionMiddleware# middleware helperfromfastapi_sqlalchemyimportdb# an object to provide global access to a database sessionfromapp.modelsimportUserapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
# once the middleware is applied, any route can then access the database session # from the global ``db``@app.get("/users")defget_users():
users=db.session.query(User).all()
returnusers

Note that the session object provided by db.session is based on the Python3.7+ ContextVar. This means that each session is linked to the individual request context in which it was created.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfromfastapi_sqlalchemyimportdbfromapp.modelsimportUser, UserCountapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=db.session.query(User).count()
db.session.add(UserCount(user_count))
db.session.commit()
# no longer able to access a database session once the db() context manager has endedreturnusers

About

Adds simple SQLAlchemy support to FastAPI

Resources

Stars

755 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

image

FastAPI-SQLAlchemy provides a simple integration between FastAPI and SQLAlchemy in your application. It gives access to useful helpers to facilitate the completion of common tasks.

Installing

Install and update using pip:

$ pip install fastapi-sqlalchemy

Examples

Models definition

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportDeclarativeMeta, declarative_base, sessionmakerfromfastapi_sqlalchemyimportSQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
#Define User classclassUser(db.Base):
__tablename__="items"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfrommodelsimportUser, dbfrompydanticimportBaseModelfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
# Add SQLAlchemy session middleware to manage database sessionsapp.add_middleware(DBSessionMiddleware, db=db)
# Endpoint to retrieve all users@app.get("/users")defget_users():
""" Retrieve a list of all users. Returns: List[User]: A list of User objects. """returnUser.query.all()
# Pydantic model for creating new usersclassUserCreate(BaseModel):
name: stremail: str# Endpoint to add a new user@app.post("/add_user")defadd_user(user_data: UserCreate):
""" Add a new user to the database. Args: user_data (UserCreate): User data including name and email. Returns: dict: A message indicating the success of the operation. """user=User(**user_data.model_dump())
print(user)
user.save()
return {"message": "User created successfully"}

You can initialize the SQLAlchemy() class similar to the way flask-sqlalchemy, this allows for multiple database connections to work at the same time.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfrommodelsimportUser, dbfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=User.query.count()
user_count=UserCount(user_count)
user_count.save()
# no longer able to access a database session once the db() context manager has endedreturnusers

Custom Model Base

You can define custom BaseModels, or extend the built in ModelBase to provide extended shared functionality for you database models.

importinspectfromtypingimportListfromsqlalchemyimportColumnfromfastapi_sqlalchemyimportModelBaseclassBaseModel(ModelBase):
@classmethoddefnew(cls, **kwargs):
obj=cls(**kwargs)
obj.save()
returnobj@classmethoddefget(cls, **kwargs):
result: cls=cls.query.filter_by(**kwargs).first()
returnresult@classmethoddefget_all(cls, **kwargs):
result: List[cls] =cls.query.filter_by(**kwargs).all()
returnresultdefupdate(self, **kwargs):
forcolumn, valueinkwargs.items():
setattr(self, column, value)
self.save()
returnself

As you can see the above BaseModel class adds support for various common functions and operations.

Complete examples

Legacy Examples

Models definition

Note the only change that you need to make is to add the db.Base inheritance to each of your model classes

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportdeclarative_base, sessionmakerfromfastapi_sqlalchemyimportModelBase, SQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
# Define the User class representing the "users" database table# Using the SQLAlchemy Base property instead of defining your own# And inheriting from the BaseModel class for type hinting and helpful builtin methods and propertiesclassUser(ModelBase, db.Base):
__tablename__="users"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfromfastapi_sqlalchemyimportDBSessionMiddleware# middleware helperfromfastapi_sqlalchemyimportdb# an object to provide global access to a database sessionfromapp.modelsimportUserapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
# once the middleware is applied, any route can then access the database session # from the global ``db``@app.get("/users")defget_users():
users=db.session.query(User).all()
returnusers

Note that the session object provided by db.session is based on the Python3.7+ ContextVar. This means that each session is linked to the individual request context in which it was created.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfromfastapi_sqlalchemyimportdbfromapp.modelsimportUser, UserCountapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=db.session.query(User).count()
db.session.add(UserCount(user_count))
db.session.commit()
# no longer able to access a database session once the db() context manager has endedreturnusers

About

Adds simple SQLAlchemy support to FastAPI

Resources

Stars

755 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

image

FastAPI-SQLAlchemy provides a simple integration between FastAPI and SQLAlchemy in your application. It gives access to useful helpers to facilitate the completion of common tasks.

Installing

Install and update using pip:

$ pip install fastapi-sqlalchemy

Examples

Models definition

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportDeclarativeMeta, declarative_base, sessionmakerfromfastapi_sqlalchemyimportSQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
#Define User classclassUser(db.Base):
__tablename__="items"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfrommodelsimportUser, dbfrompydanticimportBaseModelfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
# Add SQLAlchemy session middleware to manage database sessionsapp.add_middleware(DBSessionMiddleware, db=db)
# Endpoint to retrieve all users@app.get("/users")defget_users():
""" Retrieve a list of all users. Returns: List[User]: A list of User objects. """returnUser.query.all()
# Pydantic model for creating new usersclassUserCreate(BaseModel):
name: stremail: str# Endpoint to add a new user@app.post("/add_user")defadd_user(user_data: UserCreate):
""" Add a new user to the database. Args: user_data (UserCreate): User data including name and email. Returns: dict: A message indicating the success of the operation. """user=User(**user_data.model_dump())
print(user)
user.save()
return {"message": "User created successfully"}

You can initialize the SQLAlchemy() class similar to the way flask-sqlalchemy, this allows for multiple database connections to work at the same time.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfrommodelsimportUser, dbfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=User.query.count()
user_count=UserCount(user_count)
user_count.save()
# no longer able to access a database session once the db() context manager has endedreturnusers

Custom Model Base

You can define custom BaseModels, or extend the built in ModelBase to provide extended shared functionality for you database models.

importinspectfromtypingimportListfromsqlalchemyimportColumnfromfastapi_sqlalchemyimportModelBaseclassBaseModel(ModelBase):
@classmethoddefnew(cls, **kwargs):
obj=cls(**kwargs)
obj.save()
returnobj@classmethoddefget(cls, **kwargs):
result: cls=cls.query.filter_by(**kwargs).first()
returnresult@classmethoddefget_all(cls, **kwargs):
result: List[cls] =cls.query.filter_by(**kwargs).all()
returnresultdefupdate(self, **kwargs):
forcolumn, valueinkwargs.items():
setattr(self, column, value)
self.save()
returnself

As you can see the above BaseModel class adds support for various common functions and operations.

Complete examples

Legacy Examples

Models definition

Note the only change that you need to make is to add the db.Base inheritance to each of your model classes

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportdeclarative_base, sessionmakerfromfastapi_sqlalchemyimportModelBase, SQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
# Define the User class representing the "users" database table# Using the SQLAlchemy Base property instead of defining your own# And inheriting from the BaseModel class for type hinting and helpful builtin methods and propertiesclassUser(ModelBase, db.Base):
__tablename__="users"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfromfastapi_sqlalchemyimportDBSessionMiddleware# middleware helperfromfastapi_sqlalchemyimportdb# an object to provide global access to a database sessionfromapp.modelsimportUserapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
# once the middleware is applied, any route can then access the database session # from the global ``db``@app.get("/users")defget_users():
users=db.session.query(User).all()
returnusers

Note that the session object provided by db.session is based on the Python3.7+ ContextVar. This means that each session is linked to the individual request context in which it was created.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfromfastapi_sqlalchemyimportdbfromapp.modelsimportUser, UserCountapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=db.session.query(User).count()
db.session.add(UserCount(user_count))
db.session.commit()
# no longer able to access a database session once the db() context manager has endedreturnusers

About

Adds simple SQLAlchemy support to FastAPI

Resources

Stars

755 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

image

FastAPI-SQLAlchemy provides a simple integration between FastAPI and SQLAlchemy in your application. It gives access to useful helpers to facilitate the completion of common tasks.

Installing

Install and update using pip:

$ pip install fastapi-sqlalchemy

Examples

Models definition

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportDeclarativeMeta, declarative_base, sessionmakerfromfastapi_sqlalchemyimportSQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
#Define User classclassUser(db.Base):
__tablename__="items"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfrommodelsimportUser, dbfrompydanticimportBaseModelfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
# Add SQLAlchemy session middleware to manage database sessionsapp.add_middleware(DBSessionMiddleware, db=db)
# Endpoint to retrieve all users@app.get("/users")defget_users():
""" Retrieve a list of all users. Returns: List[User]: A list of User objects. """returnUser.query.all()
# Pydantic model for creating new usersclassUserCreate(BaseModel):
name: stremail: str# Endpoint to add a new user@app.post("/add_user")defadd_user(user_data: UserCreate):
""" Add a new user to the database. Args: user_data (UserCreate): User data including name and email. Returns: dict: A message indicating the success of the operation. """user=User(**user_data.model_dump())
print(user)
user.save()
return {"message": "User created successfully"}

You can initialize the SQLAlchemy() class similar to the way flask-sqlalchemy, this allows for multiple database connections to work at the same time.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfrommodelsimportUser, dbfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=User.query.count()
user_count=UserCount(user_count)
user_count.save()
# no longer able to access a database session once the db() context manager has endedreturnusers

Custom Model Base

You can define custom BaseModels, or extend the built in ModelBase to provide extended shared functionality for you database models.

importinspectfromtypingimportListfromsqlalchemyimportColumnfromfastapi_sqlalchemyimportModelBaseclassBaseModel(ModelBase):
@classmethoddefnew(cls, **kwargs):
obj=cls(**kwargs)
obj.save()
returnobj@classmethoddefget(cls, **kwargs):
result: cls=cls.query.filter_by(**kwargs).first()
returnresult@classmethoddefget_all(cls, **kwargs):
result: List[cls] =cls.query.filter_by(**kwargs).all()
returnresultdefupdate(self, **kwargs):
forcolumn, valueinkwargs.items():
setattr(self, column, value)
self.save()
returnself

As you can see the above BaseModel class adds support for various common functions and operations.

Complete examples

Legacy Examples

Models definition

Note the only change that you need to make is to add the db.Base inheritance to each of your model classes

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportdeclarative_base, sessionmakerfromfastapi_sqlalchemyimportModelBase, SQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
# Define the User class representing the "users" database table# Using the SQLAlchemy Base property instead of defining your own# And inheriting from the BaseModel class for type hinting and helpful builtin methods and propertiesclassUser(ModelBase, db.Base):
__tablename__="users"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfromfastapi_sqlalchemyimportDBSessionMiddleware# middleware helperfromfastapi_sqlalchemyimportdb# an object to provide global access to a database sessionfromapp.modelsimportUserapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
# once the middleware is applied, any route can then access the database session # from the global ``db``@app.get("/users")defget_users():
users=db.session.query(User).all()
returnusers

Note that the session object provided by db.session is based on the Python3.7+ ContextVar. This means that each session is linked to the individual request context in which it was created.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfromfastapi_sqlalchemyimportdbfromapp.modelsimportUser, UserCountapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=db.session.query(User).count()
db.session.add(UserCount(user_count))
db.session.commit()
# no longer able to access a database session once the db() context manager has endedreturnusers

About

Adds simple SQLAlchemy support to FastAPI

Resources

Stars

755 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

image

FastAPI-SQLAlchemy provides a simple integration between FastAPI and SQLAlchemy in your application. It gives access to useful helpers to facilitate the completion of common tasks.

Installing

Install and update using pip:

$ pip install fastapi-sqlalchemy

Examples

Models definition

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportDeclarativeMeta, declarative_base, sessionmakerfromfastapi_sqlalchemyimportSQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
#Define User classclassUser(db.Base):
__tablename__="items"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfrommodelsimportUser, dbfrompydanticimportBaseModelfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
# Add SQLAlchemy session middleware to manage database sessionsapp.add_middleware(DBSessionMiddleware, db=db)
# Endpoint to retrieve all users@app.get("/users")defget_users():
""" Retrieve a list of all users. Returns: List[User]: A list of User objects. """returnUser.query.all()
# Pydantic model for creating new usersclassUserCreate(BaseModel):
name: stremail: str# Endpoint to add a new user@app.post("/add_user")defadd_user(user_data: UserCreate):
""" Add a new user to the database. Args: user_data (UserCreate): User data including name and email. Returns: dict: A message indicating the success of the operation. """user=User(**user_data.model_dump())
print(user)
user.save()
return {"message": "User created successfully"}

You can initialize the SQLAlchemy() class similar to the way flask-sqlalchemy, this allows for multiple database connections to work at the same time.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfrommodelsimportUser, dbfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=User.query.count()
user_count=UserCount(user_count)
user_count.save()
# no longer able to access a database session once the db() context manager has endedreturnusers

Custom Model Base

You can define custom BaseModels, or extend the built in ModelBase to provide extended shared functionality for you database models.

importinspectfromtypingimportListfromsqlalchemyimportColumnfromfastapi_sqlalchemyimportModelBaseclassBaseModel(ModelBase):
@classmethoddefnew(cls, **kwargs):
obj=cls(**kwargs)
obj.save()
returnobj@classmethoddefget(cls, **kwargs):
result: cls=cls.query.filter_by(**kwargs).first()
returnresult@classmethoddefget_all(cls, **kwargs):
result: List[cls] =cls.query.filter_by(**kwargs).all()
returnresultdefupdate(self, **kwargs):
forcolumn, valueinkwargs.items():
setattr(self, column, value)
self.save()
returnself

As you can see the above BaseModel class adds support for various common functions and operations.

Complete examples

Legacy Examples

Models definition

Note the only change that you need to make is to add the db.Base inheritance to each of your model classes

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportdeclarative_base, sessionmakerfromfastapi_sqlalchemyimportModelBase, SQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
# Define the User class representing the "users" database table# Using the SQLAlchemy Base property instead of defining your own# And inheriting from the BaseModel class for type hinting and helpful builtin methods and propertiesclassUser(ModelBase, db.Base):
__tablename__="users"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfromfastapi_sqlalchemyimportDBSessionMiddleware# middleware helperfromfastapi_sqlalchemyimportdb# an object to provide global access to a database sessionfromapp.modelsimportUserapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
# once the middleware is applied, any route can then access the database session # from the global ``db``@app.get("/users")defget_users():
users=db.session.query(User).all()
returnusers

Note that the session object provided by db.session is based on the Python3.7+ ContextVar. This means that each session is linked to the individual request context in which it was created.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfromfastapi_sqlalchemyimportdbfromapp.modelsimportUser, UserCountapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=db.session.query(User).count()
db.session.add(UserCount(user_count))
db.session.commit()
# no longer able to access a database session once the db() context manager has endedreturnusers

About

Adds simple SQLAlchemy support to FastAPI

Resources

Stars

755 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

image

FastAPI-SQLAlchemy provides a simple integration between FastAPI and SQLAlchemy in your application. It gives access to useful helpers to facilitate the completion of common tasks.

Installing

Install and update using pip:

$ pip install fastapi-sqlalchemy

Examples

Models definition

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportDeclarativeMeta, declarative_base, sessionmakerfromfastapi_sqlalchemyimportSQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
#Define User classclassUser(db.Base):
__tablename__="items"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfrommodelsimportUser, dbfrompydanticimportBaseModelfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
# Add SQLAlchemy session middleware to manage database sessionsapp.add_middleware(DBSessionMiddleware, db=db)
# Endpoint to retrieve all users@app.get("/users")defget_users():
""" Retrieve a list of all users. Returns: List[User]: A list of User objects. """returnUser.query.all()
# Pydantic model for creating new usersclassUserCreate(BaseModel):
name: stremail: str# Endpoint to add a new user@app.post("/add_user")defadd_user(user_data: UserCreate):
""" Add a new user to the database. Args: user_data (UserCreate): User data including name and email. Returns: dict: A message indicating the success of the operation. """user=User(**user_data.model_dump())
print(user)
user.save()
return {"message": "User created successfully"}

You can initialize the SQLAlchemy() class similar to the way flask-sqlalchemy, this allows for multiple database connections to work at the same time.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfrommodelsimportUser, dbfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=User.query.count()
user_count=UserCount(user_count)
user_count.save()
# no longer able to access a database session once the db() context manager has endedreturnusers

Custom Model Base

You can define custom BaseModels, or extend the built in ModelBase to provide extended shared functionality for you database models.

importinspectfromtypingimportListfromsqlalchemyimportColumnfromfastapi_sqlalchemyimportModelBaseclassBaseModel(ModelBase):
@classmethoddefnew(cls, **kwargs):
obj=cls(**kwargs)
obj.save()
returnobj@classmethoddefget(cls, **kwargs):
result: cls=cls.query.filter_by(**kwargs).first()
returnresult@classmethoddefget_all(cls, **kwargs):
result: List[cls] =cls.query.filter_by(**kwargs).all()
returnresultdefupdate(self, **kwargs):
forcolumn, valueinkwargs.items():
setattr(self, column, value)
self.save()
returnself

As you can see the above BaseModel class adds support for various common functions and operations.

Complete examples

Legacy Examples

Models definition

Note the only change that you need to make is to add the db.Base inheritance to each of your model classes

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportdeclarative_base, sessionmakerfromfastapi_sqlalchemyimportModelBase, SQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
# Define the User class representing the "users" database table# Using the SQLAlchemy Base property instead of defining your own# And inheriting from the BaseModel class for type hinting and helpful builtin methods and propertiesclassUser(ModelBase, db.Base):
__tablename__="users"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfromfastapi_sqlalchemyimportDBSessionMiddleware# middleware helperfromfastapi_sqlalchemyimportdb# an object to provide global access to a database sessionfromapp.modelsimportUserapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
# once the middleware is applied, any route can then access the database session # from the global ``db``@app.get("/users")defget_users():
users=db.session.query(User).all()
returnusers

Note that the session object provided by db.session is based on the Python3.7+ ContextVar. This means that each session is linked to the individual request context in which it was created.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfromfastapi_sqlalchemyimportdbfromapp.modelsimportUser, UserCountapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=db.session.query(User).count()
db.session.add(UserCount(user_count))
db.session.commit()
# no longer able to access a database session once the db() context manager has endedreturnusers

About

Adds simple SQLAlchemy support to FastAPI

Resources

Stars

755 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

image

FastAPI-SQLAlchemy provides a simple integration between FastAPI and SQLAlchemy in your application. It gives access to useful helpers to facilitate the completion of common tasks.

Installing

Install and update using pip:

$ pip install fastapi-sqlalchemy

Examples

Models definition

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportDeclarativeMeta, declarative_base, sessionmakerfromfastapi_sqlalchemyimportSQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
#Define User classclassUser(db.Base):
__tablename__="items"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfrommodelsimportUser, dbfrompydanticimportBaseModelfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
# Add SQLAlchemy session middleware to manage database sessionsapp.add_middleware(DBSessionMiddleware, db=db)
# Endpoint to retrieve all users@app.get("/users")defget_users():
""" Retrieve a list of all users. Returns: List[User]: A list of User objects. """returnUser.query.all()
# Pydantic model for creating new usersclassUserCreate(BaseModel):
name: stremail: str# Endpoint to add a new user@app.post("/add_user")defadd_user(user_data: UserCreate):
""" Add a new user to the database. Args: user_data (UserCreate): User data including name and email. Returns: dict: A message indicating the success of the operation. """user=User(**user_data.model_dump())
print(user)
user.save()
return {"message": "User created successfully"}

You can initialize the SQLAlchemy() class similar to the way flask-sqlalchemy, this allows for multiple database connections to work at the same time.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfrommodelsimportUser, dbfromfastapi_sqlalchemyimportDBSessionMiddlewareapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=User.query.count()
user_count=UserCount(user_count)
user_count.save()
# no longer able to access a database session once the db() context manager has endedreturnusers

Custom Model Base

You can define custom BaseModels, or extend the built in ModelBase to provide extended shared functionality for you database models.

importinspectfromtypingimportListfromsqlalchemyimportColumnfromfastapi_sqlalchemyimportModelBaseclassBaseModel(ModelBase):
@classmethoddefnew(cls, **kwargs):
obj=cls(**kwargs)
obj.save()
returnobj@classmethoddefget(cls, **kwargs):
result: cls=cls.query.filter_by(**kwargs).first()
returnresult@classmethoddefget_all(cls, **kwargs):
result: List[cls] =cls.query.filter_by(**kwargs).all()
returnresultdefupdate(self, **kwargs):
forcolumn, valueinkwargs.items():
setattr(self, column, value)
self.save()
returnself

As you can see the above BaseModel class adds support for various common functions and operations.

Complete examples

Legacy Examples

Models definition

Note the only change that you need to make is to add the db.Base inheritance to each of your model classes

fromsqlalchemyimportColumn, Integer, String, create_enginefromsqlalchemy.ormimportdeclarative_base, sessionmakerfromfastapi_sqlalchemyimportModelBase, SQLAlchemydb=SQLAlchemy(url="sqlite:///example.db")
# Define the User class representing the "users" database table# Using the SQLAlchemy Base property instead of defining your own# And inheriting from the BaseModel class for type hinting and helpful builtin methods and propertiesclassUser(ModelBase, db.Base):
__tablename__="users"id=Column(Integer, primary_key=True)
name=Column(String)
email=Column(String)
def__repr__(self):
returnf"User(id={self.id}, name='{self.name}',email='{self.email}')"

Usage inside of a route

fromfastapiimportFastAPIfromfastapi_sqlalchemyimportDBSessionMiddleware# middleware helperfromfastapi_sqlalchemyimportdb# an object to provide global access to a database sessionfromapp.modelsimportUserapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
# once the middleware is applied, any route can then access the database session # from the global ``db``@app.get("/users")defget_users():
users=db.session.query(User).all()
returnusers

Note that the session object provided by db.session is based on the Python3.7+ ContextVar. This means that each session is linked to the individual request context in which it was created.

Usage outside of a route

Sometimes it is useful to be able to access the database outside the context of a request, such as in scheduled tasks which run in the background:

importpytzfromapscheduler.schedulers.asyncioimportAsyncIOScheduler# other schedulers are availablefromfastapiimportFastAPIfromfastapi_sqlalchemyimportdbfromapp.modelsimportUser, UserCountapp=FastAPI()
app.add_middleware(DBSessionMiddleware, db_url="sqlite:///example.db")
@app.on_event('startup')asyncdefstartup_event():
scheduler=AsyncIOScheduler(timezone=pytz.utc)
scheduler.start()
scheduler.add_job(count_users_task, "cron", hour=0) # runs every night at midnightdefcount_users_task():
"""Count the number of users in the database and save it into the user_counts table."""# we are outside of a request context, therefore we cannot rely on ``DBSessionMiddleware``# to create a database session for us. Instead, we can use the same ``db`` object and # use it as a context manager, like so:withdb():
user_count=db.session.query(User).count()
db.session.add(UserCount(user_count))
db.session.commit()
# no longer able to access a database session once the db() context manager has endedreturnusers

About

Adds simple SQLAlchemy support to FastAPI

Resources

Stars

755 stars

Watchers

11 watching

Forks

Releases

Packages

Used by

Contributors

Languages