您的位置:

Fastapiorm:高效便捷的Python异步ORM框架

Fastapiorm是一款基于asyncio和pydantic的Python异步ORM框架,为fastapi应用程序提供支持。与其他ORM框架相比,它不仅提供快速、高效、安全和易于使用的方式来管理数据库,还可以使用原生的Python异步语法进行操作。

一、使用Fastapiorm进行Model类重命名

1、在开发的应用程序中,Model类的命名可能受到一些限制。例如,类名必须唯一、不能与其他类重复等。Fastapiorm提供了一种方便的方式来重命名Model类,以满足应用程序的命名需求。下面是一个示例代码:


from fastapiorm import Model, StringField

class User(Model):
    name: str = StringField(max_length=50, min_length=1)

    class Config:
        orm_mode = True
        alias = "user_info"

在这个示例中,我们使用了Fastapiorm提供的Config配置属性,为User Model类重命名为user_info。这使得我们可以避免Model类命名冲突,确保代码的可维护性。

2、除了为Model类进行重命名外,Config还可以设置其他参数,例如orm_mode,这样可以在JSON序列化和反序列化期间获得更好的性能。下面是一个示例代码:


from fastapiorm import Model, StringField

class User(Model):
    name: str = StringField(max_length=50, min_length=1)

    class Config:
        orm_mode = True
        alias = "user_info"

在这个示例中,我们设置了orm_mode为True,以便在查询数据库时可以更快地反序列化JSON数据。

二、Fastapiorm的CRUD操作

Fastapiorm支持一个非常简单的API来管理数据库,无需编写任何SQL查询。下面是一些常见的CRUD操作示例:

1、创建数据:


from fastapi import FastAPI
from fastapiorm import create_database, Database, Model, StringField

database_url = "sqlite:///./data.db"

app = FastAPI()

class User(Model):
    name: str = StringField(max_length=50, min_length=1)

database = Database(database_url)

@app.on_event("startup")
async def startup():
    await database.connect()
    await create_database(database)

@app.post("/user")
async def create_user(user: User):
    await user.save()

    return {"msg": "user created!"}

@app.on_event("shutdown")
async def shutdown():
    await database.disconnect()

在这个示例中,我们首先定义了一个名为User的Model类,用于管理用户信息。然后,在启动事件时,我们通过调用create_database函数创建了数据库。

在创建数据时,我们只需要使用Model类来创建一个可序列化的Python对象,然后使用它的save方法来保存到数据库中。

2、读取数据:


@app.get("/user/{user_id}")
async def get_user(user_id: int):
    user = await User.filter(id=user_id).first().values()
    if not user:
        return {"msg": "user not found!"}

    return user[0]

在这个示例中,我们定义了一个名为get_user的路由,它可以根据用户提供的id查询用户信息。在查询时,我们使用了User类的filter方法,并传入id参数来筛选数据。然后调用first返回符合条件的第一条数据,最后使用values函数获取所有数据,并返回符合条件的第一个。

3、更新数据:


@app.put("/user/{user_id}")
async def update_user(user_id: int, user: User):
    result = await User.filter(id=user_id).update(**user.dict(exclude_unset=True))
    if not result:
        return {"msg": "user not found!"}

    return {"msg": "user updated!"}

在这个示例中,我们定义了一个名为update_user的路由,用于更新用户信息。使用User类的filter方法来查找要更新的用户,然后调用update方法来更新用户信息。在更新时,我们使用exclude_unset=True来排除用户未提供的字段值。最后返回更新结果。

4、删除数据:


@app.delete("/user/{user_id}")
async def delete_user(user_id: int):
    result = await User.filter(id=user_id).delete()
    if not result:
        return {"msg": "user not found!"}

    return {"msg": "user deleted!"}

在这个示例中,我们定义了一个名为delete_user的路由,用于删除用户信息。使用User类的filter方法来查找要删除的用户,然后调用delete方法来删除用户信息。最后返回删除结果。

三、Fastapiorm的连接池管理

Fastapiorm提供了一个内置的异步数据库连接池,可以自动管理HTTP请求期间的数据库连接。这个连接池可以被多个HTTP请求使用,而不必担心出现数据库连接不足的问题。下面是一个连接池管理示例:


from fastapiorm import create_pool, close_pool, Database

database_url = "sqlite:///./data.db"

database = Database(database_url)

async def startup():
    await database.connect()
    await create_pool(database)

async def shutdown():
    await close_pool(database)
    await database.disconnect()

在这个示例中,我们定义了一个名为database的Database对象,并在启动时调用create_pool函数来创建一个连接池管理器。在关闭应用程序时,我们调用close_pool函数来关闭连接池管理器,以便释放所有连接。在startup和shutdown事件中调用这些函数,可以确保在应用程序运行期间一直处于活动状态。

四、Fastapiorm的事务管理

Fastapiorm提供了一个简单的API用于管理事务。下面是一个示例代码:


from fastapiorm import Database, transaction

database_url = "sqlite:///./data.db"

database = Database(database_url)

async def startup():
    await database.connect()

async def shutdown():
    await database.disconnect()

@app.post("/user/transaction")
async def create_user_transaction(user: User):
    async with transaction():
        await user.save()

    return {"msg": "user created!"}

在这个示例中,我们定义了一个名为async with transaction()的上下文管理器,用于管理事务。在管理事务时,我们通过调用user.save()方法来保存用户信息。如果任何异常抛出,则上下文管理器将自动回滚事务。

五、Fastapiorm的字段类型

Fastapiorm提供了一些基本的pydantic字段类型,用于定义Model类中的属性。下面是一些常见的字段类型:

1、整数类型:IntegerField

2、浮点数类型:FloatField

3、布尔类型:BooleanField

4、字符串类型:StringField

5、日期类型:DateField

6、时间类型:TimeField

7、日期时间类型:DateTimeField

使用这些字段类型可以自动执行数据类型验证和转换,以确保插入数据库的数据类型正确。

六、Fastapiorm的查询构建器

Fastapiorm提供了一种灵活的API来构建复杂的查询语句。下面是一个示例代码:


from fastapiorm import Database, Model, StringField

database_url = "sqlite:///./data.db"

database = Database(database_url)

class User(Model):
    name: str = StringField(max_length=50, min_length=1)

async def startup():
    await database.connect()

async def shutdown():
    await database.disconnect()

@app.get("/user/search")
async def search_user(name: str):
    query = User.select().where(User.name.contains(name))
    users = await query.values()

    return users

在这个示例中,我们定义了一个名为search_user的路由,用于根据用户提供的name查询用户信息。使用User类的select方法来获取一个查询构建器。然后使用where方法来添加查询条件,使用.contains方法查询name字段的包含关系。最后使用values函数获取查询结果。

七、Fastapiorm的数据迁移

Fastapiorm还提供了一个数据迁移工具,可以用于管理数据库模式的版本控制。下面是一个示例代码:


from fastapiorm.migrations import Migrations

migrations = Migrations("./migrations", url=database_url)

@migrations.create(name="users")
def create_users_table(connection):
    with connection.cursor() as cursor:
        cursor.execute("CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY, name TEXT)")

@migrations.upgrade(name="users", version=1, to_version=2)
def upgrade_users_table(connection):
    with connection.cursor() as cursor:
        cursor.execute("ALTER TABLE users ADD COLUMN age INT")

在这个示例中,我们定义了一个名为migrations的Migrations对象,并使用它来管理数据库迁移。使用create方法创建一个名为users的数据表。使用upgrade方法,在版本1和版本2之间升级users表,并添加一个名为age的新列。

八、Fastapiorm的拓展

Fastapiorm支持使用其他拓展来增强其API和功能。例如,我们可以使用fastapi-pagination扩展来在FastAPI应用程序中实现分页功能:


from fastapi import FastAPI
from fastapi_pagination import Page, paginate
from fastapiorm import Database, Model, StringField

database_url = "sqlite:///./data.db"

database = Database(database_url)

class User(Model):
    name: str = StringField(max_length=50, min_length=1)

async def startup():
    await database.connect()

async def shutdown():
    await database.disconnect()

app = FastAPI()

@app.get("/users")
async def get_users():
    query = User.all()
    return await paginate(query)

在这个示例中,我们在FastAPI应用程序中使用fastapi-pagination扩展来添加分页支持。在路由函数中,我们使用Fastapiorm的all方法来获取所有User数据,并使用paginate函数将其分页返回。

九、总结

Fastapiorm是一款高效便捷的Python异步ORM框架。它提供了快速、高效、安全和易于使用的API来管理数据库,并使用原生的Python异步语法进行操作。与其他ORM框架相比,它具有更好的性能和更简洁的代码结构。使用Fastapiorm,我们可以轻松地构建高质量的Python应用程序,从数据库管理到数据迁移,从字段类型到分页支持,无所不包。