Skip to content

SeaQL/seaography

Folders and files

NameName
Last commit message
Last commit date

Latest commit

c181799 Â· Apr 3, 2025
Apr 3, 2025
Aug 6, 2024
Feb 14, 2025
Sep 12, 2022
Feb 14, 2025
Feb 14, 2025
Feb 14, 2025
Jun 24, 2022
Sep 12, 2022
Feb 14, 2025
Sep 11, 2022
Feb 14, 2025
Sep 11, 2022
Sep 11, 2022
Dec 2, 2024
Mar 31, 2023
Seaography logo

🧭 A GraphQL framework and code generator for SeaORM

crate docs build status

Seaography

Seaography is a GraphQL framework for building GraphQL resolvers using SeaORM entities. It ships with a CLI tool that can generate ready-to-compile Rust GraphQL servers from existing MySQL, Postgres and SQLite databases.

Benefits

  • Quick and easy to get started
  • Generates readable code
  • Extensible project structure
  • Based on popular async libraries: async-graphql and SeaORM

Features

  • Relational query (1-to-1, 1-to-N)
  • Pagination for queries and relations (1-N)
  • Filtering with operators (e.g. gt, lt, eq)
  • Order by any column
  • Guard fields, queries or relations
  • Rename fields
  • Mutations (create, update, delete)

(Right now there is no mutation, but it's on our plan!)

SeaORM Version Compatibility

Seaography SeaORM
1.1 1.1
1.0 1.0
0.12 0.12
0.3 0.10

Quick start - ready to serve in 3 minutes!

Install

cargo install sea-orm-cli@^1.0.0 # used to generate entities
cargo install seaography-cli@^1.0.0

MySQL

Setup the sakila sample database.

cd examples/mysql
sea-orm-cli generate entity -o src/entities -u mysql://user:pw@127.0.0.1/sakila --seaography
seaography-cli ./ src/entities mysql://user:pw@127.0.0.1/sakila seaography-mysql-example
cargo run

Go to http://localhost:8000/ and try out the following queries:

Fetch films and their actors

{
  film(pagination: { page: { limit: 10, page: 0 } }, orderBy: { title: ASC }) {
    nodes {
      title
      description
      releaseYear
      actor {
        nodes {
          firstName
          lastName
        }
      }
    }
  }
}

Fetch store and its employee

{
  store(filters: { storeId: { eq: 1 } }) {
    nodes {
      storeId
      address {
        address
        address2
      }
      staff {
        firstName
        lastName
      }
    }
  }
}

Fetch inactive customers with pagination

{
  customer(
    filters: { active: { eq: 0 } }
    pagination: { page: { page: 2, limit: 3 } }
  ) {
    nodes {
      customerId
      lastName
      email
    }
    paginationInfo {
      pages
      current
    }
  }
}

The query above using cursor pagination

{
  customer(
    filters: { active: { eq: 0 } }
    pagination: { cursor: { limit: 3, cursor: "Int[3]:271" } }
  ) {
    nodes {
      customerId
      lastName
      email
    }
    pageInfo {
      hasPreviousPage
      hasNextPage
      endCursor
    }
  }
}

Complex query with filters on relations

Find all inactive customers, include their address, and their payments with amount greater than 7 ordered by amount the second result

{
  customer(
    filters: { active: { eq: 0 } }
    pagination: { cursor: { limit: 3, cursor: "Int[3]:271" } }
  ) {
    nodes {
      customerId
      lastName
      email
      address {
        address
      }
      payment(
        filters: { amount: { gt: "7" } }
        orderBy: { amount: ASC }
        pagination: { page: { limit: 1, page: 1 } }
      ) {
        nodes {
          paymentId
          amount
        }
        paginationInfo {
          pages
          current
        }
        pageInfo {
          hasPreviousPage
          hasNextPage
        }
      }
    }
    pageInfo {
      hasPreviousPage
      hasNextPage
      endCursor
    }
  }
}

Filter using enumeration

{
  film(
    filters: { rating: { eq: NC17 } }
    pagination: { page: { page: 1, limit: 5 } }
  ) {
    nodes {
      filmId
      rating
    }
  }
}

Postgres

Setup the sakila sample database.

cd examples/postgres
sea-orm-cli generate entity -o src/entities -u postgres://user:pw@localhost/sakila --seaography
seaography-cli ./ src/entities postgres://user:pw@localhost/sakila seaography-postgres-example
cargo run

SQLite

cd examples/sqlite
sea-orm-cli generate entity -o src/entities -u sqlite://sakila.db --seaography
seaography-cli ./ src/entities sqlite://sakila.db seaography-sqlite-example
cargo run

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Seaography is a community driven project. We welcome you to participate, contribute and together build for Rust's future.