{"id":15017771,"url":"https://github.com/jetbrains/exposed","last_synced_at":"2026-02-27T11:29:01.826Z","repository":{"id":37431351,"uuid":"11765017","full_name":"JetBrains/Exposed","owner":"JetBrains","description":"Kotlin SQL Framework","archived":false,"fork":false,"pushed_at":"2025-04-29T10:46:05.000Z","size":32590,"stargazers_count":8689,"open_issues_count":175,"forks_count":714,"subscribers_count":129,"default_branch":"main","last_synced_at":"2025-04-29T11:42:08.538Z","etag":null,"topics":["dao","kotlin","orm","sql"],"latest_commit_sha":null,"homepage":"http://jetbrains.github.io/Exposed/","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JetBrains.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/contributing.html","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2013-07-30T12:55:27.000Z","updated_at":"2025-04-29T01:42:19.000Z","dependencies_parsed_at":"2024-01-29T13:04:57.167Z","dependency_job_id":"8b156799-2327-47f1-b0c5-277ab6bcdb79","html_url":"https://github.com/JetBrains/Exposed","commit_stats":{"total_commits":2594,"total_committers":214,"mean_commits":"12.121495327102803","dds":0.5454895913646878,"last_synced_commit":"d3c60f28674c4b96c1aa1e64531fca4f055a23ca"},"previous_names":[],"tags_count":114,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JetBrains%2FExposed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JetBrains%2FExposed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JetBrains%2FExposed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JetBrains%2FExposed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JetBrains","download_url":"https://codeload.github.com/JetBrains/Exposed/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252577020,"owners_count":21770721,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dao","kotlin","orm","sql"],"created_at":"2024-09-24T19:50:58.278Z","updated_at":"2026-02-27T11:29:01.814Z","avatar_url":"https://github.com/JetBrains.png","language":"Kotlin","readme":"\u003cdiv align=\"center\"\u003e\n\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"./documentation-website/Writerside/images/exposed-text-light.png\"\u003e\n    \u003cimg alt=\"Exposed logo\" src=\"./documentation-website/Writerside/images/exposed-text-dark.png\" width=\"215\"\u003e\n  \u003c/picture\u003e\n\n\u003c/div\u003e\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![JetBrains team project](https://jb.gg/badges/team.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)\n[![Kotlin](https://img.shields.io/badge/dynamic/toml?url=https://raw.githubusercontent.com/JetBrains/Exposed/refs/heads/main/gradle/libs.versions.toml\u0026query=%24.versions.kotlin\u0026logo=kotlin\u0026label=kotlin\u0026color=blue)](http://kotlinlang.org)\n[![Slack Channel](https://img.shields.io/badge/chat-exposed-yellow.svg?logo=slack)](https://kotlinlang.slack.com/messages/exposed/)\n[![TC Build status](https://exposed.teamcity.com/app/rest/builds/buildType:id:Exposed_Build/statusIcon.svg)](https://exposed.teamcity.com/viewType.html?buildTypeId=Exposed_Build\u0026guest=1)\n[![Maven Central](https://img.shields.io/maven-central/v/org.jetbrains.exposed/exposed-core?label=maven+central)](https://central.sonatype.com/search?namespace=org.jetbrains.exposed)\n[![GitHub License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0)\n\n\u003c/div\u003e\n\n## Welcome to **Exposed**, an ORM framework for [Kotlin](https://github.com/JetBrains/kotlin).\n\n[Exposed](https://www.jetbrains.com/exposed/) is a lightweight SQL library on top of a database connectivity driver for the Kotlin programming language,\nwith support for both JDBC and R2DBC (since version 1.0.0-*) drivers. \nIt offers two approaches for database access: a typesafe SQL-wrapping Domain-Specific Language (DSL) and a lightweight Data Access Object (DAO) API.\n\nOur official mascot is the cuttlefish, which is well-known for its outstanding mimicry ability that enables it to blend seamlessly into any environment.\nSimilar to our mascot, Exposed can be used to mimic a variety of database engines, which helps you to build applications without dependencies on any specific database engine and to switch between them with very little or no changes.\n\n## Supported Databases\n\n- H2 (versions 2.x)\n- [![MariaDB](https://img.shields.io/badge/MariaDB-003545?style=for-the-badge\u0026logo=mariadb\u0026logoColor=white)](https://github.com/mariadb-corporation/mariadb-connector-j)\n- [![MySQL](https://img.shields.io/badge/mysql-4479A1.svg?style=for-the-badge\u0026logo=mysql\u0026logoColor=white)](https://github.com/mysql/mysql-connector-j)\n- [![Oracle](https://img.shields.io/badge/Oracle-F80000?style=for-the-badge\u0026logo=oracle\u0026logoColor=white)](https://www.oracle.com/ca-en/database/technologies/appdev/jdbc-downloads.html)\n- [![Postgres](https://img.shields.io/badge/postgres-%23316192.svg?style=for-the-badge\u0026logo=postgresql\u0026logoColor=white)](https://jdbc.postgresql.org/)\n  (Also, PostgreSQL using the [pgjdbc-ng](https://impossibl.github.io/pgjdbc-ng/) JDBC driver)\n- [![MicrosoftSQLServer](https://img.shields.io/badge/Microsoft%20SQL%20Server-CC2927?style=for-the-badge\u0026logo=microsoft%20sql%20server\u0026logoColor=white)](https://github.com/microsoft/mssql-jdbc)\n- [![SQLite](https://img.shields.io/badge/sqlite-%2307405e.svg?style=for-the-badge\u0026logo=sqlite\u0026logoColor=white)](https://github.com/xerial/sqlite-jdbc)\n\n## Dependencies\n\nReleases of Exposed are available in the [Maven Central repository](https://search.maven.org/search?q=org.jetbrains.exposed).\nFor details on how to configure this repository and how to add Exposed dependencies to an existing Gradle/Maven project,\nsee the full [guide on modules](https://www.jetbrains.com/help/exposed/exposed-modules.html).\n\n### Exposed modules\n\n`Exposed` consists of the following core modules:\n\n| Module          | Function                                                                                                                                                         |\n|-----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `exposed-core`  | Provides the foundational components and abstractions needed to work with databases in a type-safe manner and includes the Domain-Specific Language (DSL) API    |\n| `exposed-dao`   | (Optional) Allows you to work with the Data Access Object (DAO) API. \u003cbr\u003e It is only compatible with `exposed-jdbc` and does not work with `exposed-r2dbc`.\u003c/br\u003e |\n| `exposed-jdbc`  | Provides support for Java Database Connectivity (JDBC) with a transport-level implementation based on the Java JDBC API                                          |\n| `exposed-r2dbc` | Provides support for Reactive Relational Database Connectivity (R2DBC)                                                                                           |\n\nAs well as the following extension modules:\n\n| Module                         | Function                                                                                                                                                                        |\n|--------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `exposed-crypt`                | Provides additional column types to store encrypted data in the database and encode/decode it on the client-side                                                                |\n| `exposed-java-time`            | Date-time extensions based on the [Java 8 Time API](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html)                                                   |\n| `exposed-jodatime`             | Date-time extensions based on the [Joda-Time](https://www.joda.org/joda-time/) library                                                                                          |\n| `exposed-json`                 | JSON and JSONB data type extensions                                                                                                                                             |\n| `exposed-kotlin-datetime`      | Date-time extensions based on the [`kotlinx-datetime`](https://kotlinlang.org/api/kotlinx-datetime/) library                                                                    |\n| `exposed-migration-core`       | Provides core common functionality for database schema migrations                                                                                                               |\n| `exposed-migration-jdbc`       | Provides utilities to support database schema migrations, with a reliance on a JDBC driver                                                                                      |\n| `exposed-migration-r2dbc`      | Provides utilities to support database schema migrations, with a reliance on a R2DBC driver                                                                                     |\n| `exposed-money`                | Extensions to support [`MonetaryAmount`](https://javamoney.github.io/apidocs/java.money/javax/money/MonetaryAmount.html) from the [JavaMoney API](https://javamoney.github.io/) |\n| `exposed-spring-boot-starter`  | A starter for [Spring Boot 3](https://spring.io/projects/spring-boot) to utilize Exposed as the ORM                                                                             |\n| `exposed-spring-boot4-starter` | A starter for [Spring Boot 4](https://spring.io/projects/spring-boot) to utilize Exposed as the ORM                                                                             |\n| `spring-transaction`           | Transaction manager that builds on top of the standard transaction workflow from Spring Framework 6                                                                             |\n| `spring7-transaction`          | Transaction manager that builds on top of the standard transaction workflow from Spring Framework 7                                                                             |\n\n### Requirements\n\nKotlin version 2.1.+\n\nThe following module(s) require JDK 17 or newer:\n* `spring-transaction` - depends on Spring Framework 6\n* `spring7-transaction` - depends on Spring Framework 7\n* `exposed-spring-boot-starter` - depends on Spring Boot 3\n* `exposed-spring-boot4-starter` - depends on Spring Boot 4\n* `exposed-crypt` - depends on Spring Security 7\n\nThe following module(s) require JDK 11 or newer:\n* `exposed-r2dbc`\n* `exposed-migration-r2dbc`\n\nAll other modules have a minimum requirement of JDK 8.\n\n## Samples using Exposed\n\nFollow the [Getting Started with DSL tutorial](https://www.jetbrains.com/help/exposed/getting-started-with-exposed.html) for a quick start or check out the [samples](samples/README.md) for more in-depth projects.\n\n## Documentation\n\nFor complete documentation, samples, and tutorials, see the following links:\n\n-   [Documentation](https://www.jetbrains.com/help/exposed/home.html)\n-   [Migration Guide](https://www.jetbrains.com/help/exposed/migration-guide-1-0-0.html)\n-   [Breaking changes](https://www.jetbrains.com/help/exposed/breaking-changes.html)\n\n## Contributing\n\n### Reporting issues\n\nWe encourage your feedback in any form, such as feature requests, bug reports, documentation updates, and questions.\n\nPlease use [our issue tracker](https://youtrack.jetbrains.com/issues/EXPOSED) to report any issues or to log new requests.\n\nWhile issues are visible publicly, either creating a new issue or commenting on an existing one does require logging in to YouTrack.\n\n### Submitting pull requests\n\nWe actively welcome your pull requests and encourage you to link your work to an [existing issue](https://youtrack.jetbrains.com/issues/EXPOSED).\n\n\nSee the full [contribution guide](https://www.jetbrains.com/help/exposed/contributing.html#pull-requests) for more details.\n\nBy contributing to the Exposed project, you agree that your contributions will be licensed under [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0).\n\u003cbr\u003e\u003cbr\u003e\n\n## Support\n\nHave questions or want to contribute to the discussion? Join us in the [#exposed](https://kotlinlang.slack.com/messages/exposed/) channel on the [Kotlin Slack](https://kotlinlang.slack.com/).\nIf you're not a member yet, you can [request an invitation](https://surveys.jetbrains.com/s3/kotlin-slack-sign-up).\n\n## Examples\n\n### SQL DSL\n\n```kotlin\nimport org.jetbrains.exposed.v1.core.*\nimport org.jetbrains.exposed.v1.core.SqlExpressionBuilder.like\nimport org.jetbrains.exposed.v1.jdbc.*\nimport org.jetbrains.exposed.v1.jdbc.transactions.transaction\n\nobject Cities : Table() {\n    val id = integer(\"id\").autoIncrement()\n    val name = varchar(\"name\", 50)\n\n    override val primaryKey = PrimaryKey(id)\n}\n\nobject Users : Table() {\n    val id = varchar(\"id\", 10)\n    val name = varchar(\"name\", length = 50)\n    val cityId = integer(\"city_id\").references(Cities.id).nullable()\n\n    override val primaryKey = PrimaryKey(id, name = \"PK_User_ID\")\n}\n\nfun main() {\n    Database.connect(\"jdbc:h2:mem:test\", driver = \"org.h2.Driver\", user = \"root\", password = \"\")\n\n    transaction {\n        addLogger(StdOutSqlLogger)\n\n        SchemaUtils.create(Cities, Users)\n\n        val saintPetersburgId = Cities.insert {\n            it[name] = \"St. Petersburg\"\n        } get Cities.id\n\n        val munichId = Cities.insert {\n            it[name] = \"Munich\"\n        } get Cities.id\n\n        val pragueId = Cities.insert {\n            it.update(name, stringLiteral(\"   Prague   \").trim().substring(1, 2))\n        }[Cities.id]\n\n        val pragueName = Cities\n            .selectAll()\n            .where { Cities.id eq pragueId }\n            .single()[Cities.name]\n        println(\"pragueName = $pragueName\")\n\n        Users.insert {\n            it[id] = \"andrey\"\n            it[name] = \"Andrey\"\n            it[cityId] = saintPetersburgId\n        }\n\n        Users.insert {\n            it[id] = \"sergey\"\n            it[name] = \"Sergey\"\n            it[cityId] = munichId\n        }\n\n        Users.insert {\n            it[id] = \"eugene\"\n            it[name] = \"Eugene\"\n            it[cityId] = munichId\n        }\n\n        Users.insert {\n            it[id] = \"alex\"\n            it[name] = \"Alex\"\n            it[cityId] = null\n        }\n\n        Users.insert {\n            it[id] = \"smth\"\n            it[name] = \"Something\"\n            it[cityId] = null\n        }\n\n        Users.update(where = { Users.id eq \"alex\" }) {\n            it[name] = \"Alexey\"\n        }\n\n        Users.deleteWhere { Users.name like \"%thing\" }\n\n        println(\"All cities:\")\n\n        Cities\n            .selectAll()\n            .forEach { result -\u003e\n                println(\"${result[Cities.id]}: ${result[Cities.name]}\")\n            }\n\n        println(\"Manual join:\")\n\n        (Users innerJoin Cities)\n            .select(Users.name, Cities.name)\n            .where {\n                (Users.id.eq(\"andrey\") or Users.name.eq(\"Sergey\")) and\n                    Users.id.eq(\"sergey\") and Users.cityId.eq(Cities.id)\n            }.forEach { result -\u003e\n                println(\"${result[Users.name]} lives in ${result[Cities.name]}\")\n            }\n\n        println(\"Join with foreign key:\")\n\n        (Users innerJoin Cities)\n            .select(Users.name, Users.cityId, Cities.name)\n            .where { Cities.name.eq(\"St. Petersburg\") or Users.cityId.isNull() }\n            .forEach { result -\u003e\n                if (result[Users.cityId] != null) {\n                    println(\"${result[Users.name]} lives in ${result[Cities.name]}\")\n                } else {\n                    println(\"${result[Users.name]} lives nowhere\")\n                }\n            }\n\n        println(\"Functions and group by:\")\n\n        (Cities innerJoin Users)\n            .select(Cities.name, Users.id.count())\n            .groupBy(Cities.name)\n            .forEach { result -\u003e\n                val cityName = result[Cities.name]\n                val userCount = result[Users.id.count()]\n\n                if (userCount \u003e 0) {\n                    println(\"$userCount user(s) live(s) in $cityName\")\n                } else {\n                    println(\"Nobody lives in $cityName\")\n                }\n            }\n\n        SchemaUtils.drop(Users, Cities)\n    }\n}\n\n```\n\nGenerated SQL:\n\n```sql\n    SQL: CREATE TABLE IF NOT EXISTS CITIES (ID INT AUTO_INCREMENT PRIMARY KEY, \"name\" VARCHAR(50) NOT NULL)\n    SQL: CREATE TABLE IF NOT EXISTS USERS (ID VARCHAR(10), \"name\" VARCHAR(50) NOT NULL, CITY_ID INT NULL, CONSTRAINT PK_User_ID PRIMARY KEY (ID), CONSTRAINT FK_USERS_CITY_ID__ID FOREIGN KEY (CITY_ID) REFERENCES CITIES(ID) ON DELETE RESTRICT ON UPDATE RESTRICT)\n    SQL: INSERT INTO CITIES (\"name\") VALUES ('St. Petersburg')\n    SQL: INSERT INTO CITIES (\"name\") VALUES ('Munich')\n    SQL: INSERT INTO CITIES (\"name\") VALUES (SUBSTRING(TRIM('   Prague   '), 1, 2))\n    SQL: SELECT CITIES.ID, CITIES.\"name\" FROM CITIES WHERE CITIES.ID = 3\n    pragueName = Pr\n    SQL: INSERT INTO USERS (ID, \"name\", CITY_ID) VALUES ('andrey', 'Andrey', 1)\n    SQL: INSERT INTO USERS (ID, \"name\", CITY_ID) VALUES ('sergey', 'Sergey', 2)\n    SQL: INSERT INTO USERS (ID, \"name\", CITY_ID) VALUES ('eugene', 'Eugene', 2)\n    SQL: INSERT INTO USERS (ID, \"name\", CITY_ID) VALUES ('alex', 'Alex', NULL)\n    SQL: INSERT INTO USERS (ID, \"name\", CITY_ID) VALUES ('smth', 'Something', NULL)\n    SQL: UPDATE USERS SET \"name\"='Alexey' WHERE USERS.ID = 'alex'\n    SQL: DELETE FROM USERS WHERE USERS.\"name\" LIKE '%thing'\n    All cities:\n    SQL: SELECT CITIES.ID, CITIES.\"name\" FROM CITIES\n    1: St. Petersburg\n    2: Munich\n    3: Pr\n    Manual join:\n    SQL: SELECT USERS.\"name\", CITIES.\"name\" FROM USERS INNER JOIN CITIES ON CITIES.ID = USERS.CITY_ID WHERE ((USERS.ID = 'andrey') OR (USERS.\"name\" = 'Sergey')) AND (USERS.ID = 'sergey') AND (USERS.CITY_ID = CITIES.ID)\n    Sergey lives in Munich\n    Join with foreign key:\n    SQL: SELECT USERS.\"name\", USERS.CITY_ID, CITIES.\"name\" FROM USERS INNER JOIN CITIES ON CITIES.ID = USERS.CITY_ID WHERE (CITIES.\"name\" = 'St. Petersburg') OR (USERS.CITY_ID IS NULL)\n    Andrey lives in St. Petersburg\n    Functions and group by:\n    SQL: SELECT CITIES.\"name\", COUNT(USERS.ID) FROM CITIES INNER JOIN USERS ON CITIES.ID = USERS.CITY_ID GROUP BY CITIES.\"name\"\n    2 user(s) live(s) in Munich\n    1 user(s) live(s) in St. Petersburg\n    SQL: DROP TABLE IF EXISTS USERS\n    SQL: DROP TABLE IF EXISTS CITIES\n```\n\n### DAO\n\n```kotlin\nimport org.jetbrains.exposed.v1.core.StdOutSqlLogger\nimport org.jetbrains.exposed.v1.core.dao.id.*\nimport org.jetbrains.exposed.v1.dao.*\nimport org.jetbrains.exposed.v1.jdbc.*\nimport org.jetbrains.exposed.v1.jdbc.transactions.transaction\n\nobject Cities: IntIdTable() {\n    val name = varchar(\"name\", 50)\n}\n\nobject Users : IntIdTable() {\n    val name = varchar(\"name\", length = 50).index()\n    val city = reference(\"city\", Cities)\n    val age = integer(\"age\")\n}\n\nclass City(id: EntityID\u003cInt\u003e) : IntEntity(id) {\n    companion object : IntEntityClass\u003cCity\u003e(Cities)\n\n    var name by Cities.name\n    val users by User referrersOn Users.city\n}\n\nclass User(id: EntityID\u003cInt\u003e) : IntEntity(id) {\n    companion object : IntEntityClass\u003cUser\u003e(Users)\n\n    var name by Users.name\n    var city by City referencedOn Users.city\n    var age by Users.age\n}\n\nfun main() {\n    Database.connect(\"jdbc:h2:mem:test\", driver = \"org.h2.Driver\", user = \"root\", password = \"\")\n\n    transaction {\n        addLogger(StdOutSqlLogger)\n\n        val saintPetersburg = City.new {\n            name = \"St. Petersburg\"\n        }\n\n        val munich = City.new {\n            name = \"Munich\"\n        }\n\n        User.new {\n            name = \"Andrey\"\n            city = saintPetersburg\n            age = 5\n        }\n\n        User.new {\n            name = \"Sergey\"\n            city = saintPetersburg\n            age = 27\n        }\n\n        User.new {\n            name = \"Eugene\"\n            city = munich\n            age = 42\n        }\n\n        val alex = User.new {\n            name = \"alex\"\n            city = munich\n            age = 11\n        }\n\n        alex.name = \"Alexey\"\n\n        println(\"Cities: ${City.all().joinToString { it.name }}\")\n\n        println(\"Users in ${saintPetersburg.name}: ${saintPetersburg.users.joinToString { it.name }}\")\n\n        println(\"Adults: ${User.find { Users.age greaterEq 18 }.joinToString { it.name }}\")\n\n        SchemaUtils.drop(Users, Cities)\n    }\n}\n```\n\nGenerated SQL:\n\n```sql\n    SQL: CREATE TABLE IF NOT EXISTS CITIES (ID INT AUTO_INCREMENT PRIMARY KEY, \"name\" VARCHAR(50) NOT NULL)\n    SQL: CREATE TABLE IF NOT EXISTS USERS (ID INT AUTO_INCREMENT PRIMARY KEY, \"name\" VARCHAR(50) NOT NULL, CITY INT NOT NULL, AGE INT NOT NULL, CONSTRAINT FK_USERS_CITY__ID FOREIGN KEY (CITY) REFERENCES CITIES(ID) ON DELETE RESTRICT ON UPDATE RESTRICT)\n    SQL: CREATE INDEX USERS_NAME ON USERS (\"name\")\n    SQL: INSERT INTO CITIES (\"name\") VALUES ('St. Petersburg')\n    SQL: INSERT INTO CITIES (\"name\") VALUES ('Munich')\n    SQL: SELECT CITIES.ID, CITIES.\"name\" FROM CITIES\n    Cities: St. Petersburg, Munich\n    SQL: INSERT INTO USERS (\"name\", CITY, AGE) VALUES ('Andrey', 1, 5)\n    SQL: INSERT INTO USERS (\"name\", CITY, AGE) VALUES ('Sergey', 1, 27)\n    SQL: INSERT INTO USERS (\"name\", CITY, AGE) VALUES ('Eugene', 2, 42)\n    SQL: INSERT INTO USERS (\"name\", CITY, AGE) VALUES ('Alexey', 2, 11)\n    SQL: SELECT USERS.ID, USERS.\"name\", USERS.CITY, USERS.AGE FROM USERS WHERE USERS.CITY = 1\n    Users in St. Petersburg: Andrey, Sergey\n    SQL: SELECT USERS.ID, USERS.\"name\", USERS.CITY, USERS.AGE FROM USERS WHERE USERS.AGE \u003e= 18\n    Adults: Sergey, Eugene\n    SQL: DROP TABLE IF EXISTS USERS\n    SQL: DROP TABLE IF EXISTS CITIES\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjetbrains%2Fexposed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjetbrains%2Fexposed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjetbrains%2Fexposed/lists"}