sqlite support added to sqlbuilder
zoujiaqing
zoujiaqing at gmail.com
Sun Jan 21 21:27:30 UTC 2024
On Saturday, 30 December 2023 at 22:11:55 UTC, Steven
Schveighoffer wrote:
> https://code.dlang.org/packages/sqlbuilder
>
> This project is something I use extensively in my work project,
> and allows dynamic building of SQL statements in a way that
> automatically deals with joins.
>
> It also automatically serializes directly to structs
> representing database rows. It was featured in my dconf 2022
> online talk -- Model all the things.
>
> I just added support to use sqlite. The API isn't stable yet,
> but still super useful. It's one of those build-it-as-I-need-it
> things, so while there's a semblance of a plan, things that are
> finished are things that I've needed.
>
> An example (with sqlite):
>
> ```d
> import d2sqlite3;
>
> import std.stdio;
> import std.file : exists;
> import std.array;
>
> // yeah, I know, I need a package include here...
> import sqlbuilder.uda;
> import sqlbuilder.dataset;
> import sqlbuilder.dialect.sqlite;
> import sqlbuilder.types;
>
> import d2sqlite3;
>
> struct Author
> {
> @primaryKey @autoIncrement int id;
> string firstname;
> string lastname;
> static @refersTo!Book @mapping("author_id") Relation books;
> }
>
> struct Book
> {
> @primaryKey @autoIncrement int id;
> string title;
> string description;
> @mustReferTo!Author("author") int author_id;
> }
>
> void main()
> {
> auto shouldInitialize = !exists("books.sqlite");
> auto db = Database("books.sqlite");
> if(shouldInitialize)
> {
> // create the tables
> db.execute(createTableSql!Author);
> db.execute(createTableSql!Book);
>
> // add some books and authors
> Author walter = Author(
> firstname: "Walter",
> lastname: "Bright");
> db.create(walter); // automatic serialization to sql
> insertion statement
> Author andrei = Author(
> firstname: "Andrei",
> lastname: "Alexandrescu");
> db.create(andrei);
>
> db.create(Book(
> title: "The D Programming Language",
> description: "The OG D manual",
> author_id: andrei.id));
> db.create(Book(
> title: "Modern C++ Design",
> description: "The OG C++ template manual",
> author_id: andrei.id));
> db.create(Book(
> title: "The D specification",
> description: "The Spec of the D programming
> language",
> author_id: walter.id));
> }
>
> // get an author by name
> DataSet!Author ads;
> auto andrei = db.fetchOne(select(ads).where(ads.firstname,
> " = 'Andrei'"));
> // do some selections based on the dataset of books
> DataSet!Book bds;
> foreach(booktitle, author; db.fetch(select(bds.title,
> bds.author)))
> {
> writefln("Found book %s, written by %s %s",
> booktitle, author.firstname,
> author.lastname);
> }
> auto andreiBooks = db.fetch(select(bds)
> .where(bds.author_id, " = ",
> andrei.id.param)).array;
> writeln("Andrei's books: ", andreiBooks);
> }
> ```
>
> Code is very similar for using mysql as well, just import
> mysql-native and sqlbuilder.dialect.mysql.
>
> Next up would be postgresql, not sure when I'll have a need to
> build that...
>
> -Steve
Thank you! I want postgresql :)
More information about the Digitalmars-d-announce
mailing list