flutter Moor数据库

https://moor.simonbinder.eu/docs/getting-started/

moor.png

Expression<D>

  • moor中Table中的Column或者where中的条件设定都是Expression<D>Expression<D>能将自身对应的sql写到GenerationContextStringBuffer
  • 如此一来,每条数据库命令就可以通过GenerationContextStringBuffer得到
  • GenerationContext

GenerationContext的创建和sql命令的拼接在以下方法中,以下方法一般在go()方法中调用

  GenerationContext constructQuery() {
    final ctx = GenerationContext.fromDb(database);

    // whether we need to insert a space before writing the next component
    var needsWhitespace = false;

    void writeWithSpace(Component /*?*/ component) {
      if (component == null) return;

      if (needsWhitespace) ctx.writeWhitespace();
      component.writeInto(ctx);
      needsWhitespace = true;
    }

    writeStartPart(ctx);
    needsWhitespace = true;

    writeWithSpace(whereExpr);
    writeWithSpace(_groupBy);
    writeWithSpace(orderByExpr);
    writeWithSpace(limitExpr);

    ctx.buffer.write(';');

    return ctx;
  }
}

join

https://www.w3schools.com/sql/sql_join.asp
如下所示,

  • leftOuterJoin则是所有MyDatabase().todos会被取出,MyDatabase().categories.id.equalsExp(MyDatabase().todos.category)的MyDatabase().categories会被取出
  • innerJoin则是MyDatabase().categories.id.equalsExp(MyDatabase().todos.category)的MyDatabase().categories和MyDatabase().todos才会被取出
  • crossJoin则是MyDatabase().categories和MyDatabase().todos都会被取出,且交叉匹配。也就是如果MyDatabase().categories有3条数据MyDatabase().todos有2条数据,则select得到2x3=6条数据
MyDatabase()
                    .select(MyDatabase().todos)
                    .join(
                      [
                        leftOuterJoin(
                          MyDatabase().categories,
                          MyDatabase().categories.id.equalsExp(MyDatabase().todos.category),
                        ),
                         // crossJoin(
                        //   MyDatabase().categories,
                        // ),
                      ],
                    )
                    .get()
                    .then((value) {
                      print(value);
                      value.forEach((e){
                        print(e.readTable(MyDatabase().todos)?.toJson());
                        print(e.readTable(MyDatabase().categories)?.toJson());
                      });
                    });
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容