原文
项目
该项目在我工作项目中广泛使用,它允许自动处理联接方式动态构建SQL语句.
还会自动直接按表示数据库行结构序化.它在dconf2022在线演讲中介绍了:建模一切.
刚刚添加了对sqlite的支持.该API还不稳定,但仍非常有用.这是按需构建,所以虽然有个计划外表,但满足了我的需要.
示例(使用sqlite):
import d2sqlite3;
import std.stdio;
import std.file : exists;
import std.array;
//是的,我知道,在此我需要一个包装
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){//创建表db.execute(createTableSql!Author);db.execute(createTableSql!Book);//添加一些书籍和作者Author walter = Author( firstname: "Walter", lastname: "Bright");db.create(walter); //按`SQL`插入语句自动序化Author andrei = Author( firstname: "Andrei", lastname: "Alexandrescu");db.create(andrei);db.create(Book(title: "D语言",description: "The OG D manual",author_id: andrei.id));db.create(Book(title: "C++ 设计",description: "The OG C++ template manual",author_id: andrei.id));db.create(Book(title: "D规范",description: "D语言规范",author_id: walter.id));}//按姓名取作者DataSet!Author ads;auto andrei = db.fetchOne(select(ads).where(ads.firstname, " = 'Andrei'"));//根据书籍的数据集来选择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);
}
使用mysql的代码也类似,只需导入mysql-native和sqlbuilder.dialect.mysql即可.
接着是postgresql,不确定我何时需要构建它.
-史蒂夫