Package orm 一个简单小巧的 orm 实现方案 目前内置了对以下数据库的支持: 其它数据库,用户可以通过实现 Dialect 接口,来实现相应的支持。 初始化: 默认情况下,orm 包并不会加载任何数据库的实例。所以想要用哪个数据库,需要手动初始化: 占位符 SQL 语句可以使用 # 字符在语句中暂替真实的表名前缀,也可以使用 {} 包含一个关键字,使其它成为普通列名,如: 在实际执行时,相关的占位符就会被替换成与当前环境想容的实例,如在表名前缀为 p_, 数据库为 mysql 时,会被替换成以下语句,然后再执行: DB.Query(),DB.Exec(),DB.Prepare().DB.Where() 及 Tx 与之对应的函数都可以使用占位符。 Model 不能指定占位符,它们默认总会使用占位符,且无法取消。 Model: orm 包通过 struct tag 来描述 model 在数据库中的结构。大概格式如下: 目前支持以下的 struct tag: model.Metaer: 在 Go 不能将 struct tag 作用于结构体,所以为了指定一些表级别的属性, 只能通过接口的形式,在接口方法中返回一段类似于 struct tag 的字符串, 以达到相同的目的。 在 model.Metaer 每种数据库可以指定一些自定义的属性,这些属性都将会被保存到 Model.Meta 中,各个数据库的自定义属性以其名称开头,比如 mysql 的 charset 属性, 可以使用 mysql_charset。 同时还包含了以下几种通用的属性信息: 约束名: index、unique、check 和 fk 都是可以指定约束名的,在表中,约束名必须是唯一的, 即便是不同类型的约束,比如已经有一个 unique 的约束名叫作 name,那么其它类 型的约束,就不能再取这个名称了。 部分数据库(比如 postgres)可能要求约束名是整个数据库唯一的, 为了统一,在 ORM 中所有数据都强制约束名全局(数据库)唯一。 如何使用: Create: 可以通过 DB.Create() 或是 Tx.Create() 创建一张表。 Update: Delete: Insert: Select: Query/Exec: 事务: 默认的 DB 是不支持事务的,若需要事务支持,则需要调用 DB.Begin() 返回事务对象 Tx,当然并不是所有的数据库都支持事务操作的。 Tx 拥有一组与 DB 相同的接口。
Package orm 一个简单小巧的 orm 实现方案 目前内置了对以下数据库的支持: 其它数据库,用户可以通过实现 Dialect 接口,来实现相应的支持。 初始化: 默认情况下,orm 包并不会加载任何数据库的实例。所以想要用哪个数据库,需要手动初始化: 占位符 SQL 语句可以使用 # 字符在语句中暂替真实的表名前缀,也可以使用 {} 包含一个关键字,使其它成为普通列名,如: 在实际执行时,相关的占位符就会被替换成与当前环境想容的实例,如在表名前缀为 p_, 数据库为 mysql 时,会被替换成以下语句,然后再执行: DB.Query(),DB.Exec(),DB.Prepare().DB.Where() 及 Tx 与之对应的函数都可以使用占位符。 Model 不能指定占位符,它们默认总会使用占位符,且无法取消。 Model: orm 包通过 struct tag 来描述 model 在数据库中的结构。大概格式如下: 目前支持以下的 struct tag: model.Metaer: 在 Go 不能将 struct tag 作用于结构体,所以为了指定一些表级别的属性, 只能通过接口的形式,在接口方法中返回一段类似于 struct tag 的字符串, 以达到相同的目的。 在 model.Metaer 每种数据库可以指定一些自定义的属性,这些属性都将会被保存到 Model.Meta 中,各个数据库的自定义属性以其名称开头,比如 mysql 的 charset 属性, 可以使用 mysql_charset。 同时还包含了以下几种通用的属性信息: 约束名: index、unique、check 和 fk 都是可以指定约束名的,在表中,约束名必须是唯一的, 即便是不同类型的约束,比如已经有一个 unique 的约束名叫作 name,那么其它类 型的约束,就不能再取这个名称了。 部分数据库(比如 postgres)可能要求约束名是整个数据库唯一的, 为了统一,在 ORM 中所有数据都强制约束名全局(数据库)唯一。 如何使用: Create: 可以通过 DB.Create() 或是 Tx.Create() 创建一张表。 Update: Delete: Insert: Select: Query/Exec: 事务: 默认的 DB 是不支持事务的,若需要事务支持,则需要调用 DB.Begin() 返回事务对象 Tx,当然并不是所有的数据库都支持事务操作的。 Tx 拥有一组与 DB 相同的接口。
Package orm 一个简单小巧的 orm 实现方案。 目前内置了对以下数据库的支持: 其它数据库,用户可以通过实现 Dialect 接口,来实现相应的支持。 初始化: 默认情况下,orm 包并不会加载任何数据库的实例。所以想要用哪个数据库,需要手动初始化: 占位符 SQL 语句可以使用'#'字符在语句中暂替真实的表名前缀,也可以使用{} 包含一个关键字,使其它成为普通列名,如: 在实际执行时,如 DB.Query(),将第一个参数 replace 指定为 true, 相关的占位符就会被替换成与当前环境想容的实例,如在表名前缀为p_, 数据库为 mysql 时,会被替换成以下语句,然后再执行: DB.Query(),DB.Exec(),DB.Prepare().DB.Where() 及 Tx与之对应的函数都可以使用占位符。 Model 不能指定占位符,它们默认总会使用占位符,且无法取消。 Model: orm 包通过 struct tag 来描述 model 在数据库中的结构。大概格式如下: 目前支持以下的 struct tag: 关于core.Metaer接口。 在go不能将struct tag作用于结构体,所以为了指定一些表级别的属性, 只能通过接口的形式,在接口方法中返回一段类似于struct tag的字符串, 以达到相同的目的。 在core.Metaer中除了可以指定name(table_name)和check(name,expr)两个属性之外, 还可指定一些自定义的属性,这些属性都将会被保存到Model.Meta中。 约束名: index,unique,check,fk 都是可以指定约束名的,在表中,约束名必须是唯一的, 即便是不同类型的约束,比如已经有一个 unique 的约束名叫作 name,那么其它类 型的约束,就不能再取这个名称了。 如何使用: Create: 可以通过 Engine.Create() 或是 Tx.Create() 创建一张表。 Update: Delete: Insert: Select: Query/Exec: 事务: 默认的 DB 是不支持事务的,若需要事务支持,则需要调用 DB.Begin() 返回事务对象 Tx,当然并不是所有的数据库都支持事务操作的。 Tx拥有一组与 DB 相同的接口,另外还提供了一组以 `Mult` 开头的函数, 用以同时操作多条记录的。
Package orm 一个简单小巧的 orm 实现方案。 目前内置了对以下数据库的支持: 其它数据库,用户可以通过实现 Dialect 接口,来实现相应的支持。 初始化: 默认情况下,orm 包并不会加载任何数据库的实例。所以想要用哪个数据库,需要手动初始化: 占位符 SQL 语句可以使用 # 字符在语句中暂替真实的表名前缀,也可以使用 {} 包含一个关键字,使其它成为普通列名,如: 在实际执行时,相关的占位符就会被替换成与当前环境想容的实例,如在表名前缀为 p_, 数据库为 mysql 时,会被替换成以下语句,然后再执行: DB.Query(),DB.Exec(),DB.Prepare().DB.Where() 及 Tx 与之对应的函数都可以使用占位符。 Model 不能指定占位符,它们默认总会使用占位符,且无法取消。 Model: orm 包通过 struct tag 来描述 model 在数据库中的结构。大概格式如下: 目前支持以下的 struct tag: model.Metaer: 在 Go 不能将 struct tag 作用于结构体,所以为了指定一些表级别的属性, 只能通过接口的形式,在接口方法中返回一段类似于 struct tag 的字符串, 以达到相同的目的。 在 model.Metaer 中除了可以指定 name(table_name) 和 check(name,expr) 两个属性之外, 每种数据库还可指定一些自定义的属性,这些属性都将会被保存到 Model.Meta 中, 各个数据库的自定义属性以其名称开头,比如 mysql 的 charset 属性,可以使用 mysql_charset。 约束名: index、unique、check 和 fk 都是可以指定约束名的,在表中,约束名必须是唯一的, 即便是不同类型的约束,比如已经有一个 unique 的约束名叫作 name,那么其它类 型的约束,就不能再取这个名称了。 部分数据库(比如 postgres)可能要求约束名是整个数据库唯一的, 使用都需要自行处理可能重名的问题。 如何使用: Create: 可以通过 DB.Create() 或是 Tx.Create() 创建一张表。 Update: Delete: Insert: Select: Query/Exec: 事务: 默认的 DB 是不支持事务的,若需要事务支持,则需要调用 DB.Begin() 返回事务对象 Tx,当然并不是所有的数据库都支持事务操作的。 Tx拥有一组与 DB 相同的接口,另外还提供了一组以 `Mult` 开头的函数, 用以同时操作多条记录的。
Package orm 一个简单小巧的 orm 实现方案。 目前内置了对以下数据库的支持: 其它数据库,用户可以通过实现 Dialect 接口,来实现相应的支持。 初始化: 默认情况下,orm 包并不会加载任何数据库的实例。所以想要用哪个数据库,需要手动初始化: 占位符 SQL 语句可以使用 # 字符在语句中暂替真实的表名前缀,也可以使用 {} 包含一个关键字,使其它成为普通列名,如: 在实际执行时,相关的占位符就会被替换成与当前环境想容的实例,如在表名前缀为 p_, 数据库为 mysql 时,会被替换成以下语句,然后再执行: DB.Query(),DB.Exec(),DB.Prepare().DB.Where() 及 Tx 与之对应的函数都可以使用占位符。 Model 不能指定占位符,它们默认总会使用占位符,且无法取消。 Model: orm 包通过 struct tag 来描述 model 在数据库中的结构。大概格式如下: 目前支持以下的 struct tag: occ(true|false) 当前列作为乐观锁字段。 model.Metaer: 在 Go 不能将 struct tag 作用于结构体,所以为了指定一些表级别的属性, 只能通过接口的形式,在接口方法中返回一段类似于 struct tag 的字符串, 以达到相同的目的。 在 model.Metaer 中除了可以指定 name(table_name) 和 check(name,expr) 两个属性之外, 还可指定一些自定义的属性,这些属性都将会被保存到 Model.Meta 中。 约束名: index,unique,check,fk 都是可以指定约束名的,在表中,约束名必须是唯一的, 即便是不同类型的约束,比如已经有一个 unique 的约束名叫作 name,那么其它类 型的约束,就不能再取这个名称了。 如何使用: Create: 可以通过 DB.Create() 或是 Tx.Create() 创建一张表。 Update: Delete: Insert: Select: Query/Exec: 事务: 默认的 DB 是不支持事务的,若需要事务支持,则需要调用 DB.Begin() 返回事务对象 Tx,当然并不是所有的数据库都支持事务操作的。 Tx拥有一组与 DB 相同的接口,另外还提供了一组以 `Mult` 开头的函数, 用以同时操作多条记录的。
Package orm 一个简单小巧的 orm 实现方案。 目前内置了对以下数据库的支持: 其它数据库,用户可以通过实现 Dialect 接口,来实现相应的支持。 初始化: 默认情况下,orm 包并不会加载任何数据库的实例。所以想要用哪个数据库,需要手动初始化: 占位符 SQL 语句可以使用 # 字符在语句中暂替真实的表名前缀,也可以使用 {} 包含一个关键字,使其它成为普通列名,如: 在实际执行时,相关的占位符就会被替换成与当前环境想容的实例,如在表名前缀为 p_, 数据库为 mysql 时,会被替换成以下语句,然后再执行: DB.Query(),DB.Exec(),DB.Prepare().DB.Where() 及 Tx 与之对应的函数都可以使用占位符。 Model 不能指定占位符,它们默认总会使用占位符,且无法取消。 Model: orm 包通过 struct tag 来描述 model 在数据库中的结构。大概格式如下: 目前支持以下的 struct tag: model.Metaer: 在 Go 不能将 struct tag 作用于结构体,所以为了指定一些表级别的属性, 只能通过接口的形式,在接口方法中返回一段类似于 struct tag 的字符串, 以达到相同的目的。 在 model.Metaer 中除了可以指定 name(table_name) 和 check(name,expr) 两个属性之外, 每种数据库还可指定一些自定义的属性,这些属性都将会被保存到 Model.Meta 中, 各个数据库的自定义属性以其名称开头,比如 mysql 的 charset 属性,可以使用 mysql_charset。 约束名: index、unique、check 和 fk 都是可以指定约束名的,在表中,约束名必须是唯一的, 即便是不同类型的约束,比如已经有一个 unique 的约束名叫作 name,那么其它类 型的约束,就不能再取这个名称了。 部分数据库(比如 postgres)可能要求约束名是整个数据库唯一的, 使用都需要自行处理可能重名的问题。 如何使用: Create: 可以通过 DB.Create() 或是 Tx.Create() 创建一张表。 Update: Delete: Insert: Select: Query/Exec: 事务: 默认的 DB 是不支持事务的,若需要事务支持,则需要调用 DB.Begin() 返回事务对象 Tx,当然并不是所有的数据库都支持事务操作的。 Tx拥有一组与 DB 相同的接口,另外还提供了一组以 `Mult` 开头的函数, 用以同时操作多条记录的。
Package orm 一个简单小巧的 orm 实现方案 目前内置了对以下数据库的支持: 其它数据库,用户可以通过实现 Dialect 接口,来实现相应的支持。 初始化: 默认情况下,orm 包并不会加载任何数据库的实例。所以想要用哪个数据库,需要手动初始化: 占位符 SQL 语句可以使用 {} 包含一个关键字,使其它成为普通列名,如: 在实际执行时,相关的占位符就会被替换成与当前环境想容的实例, 如在数据库为 mysql 时,会被替换成以下语句,然后再执行: DB.Query(),DB.Exec(),DB.Prepare().DB.Where() 及 Tx 与之对应的函数都可以使用占位符。 Model 不能指定占位符,它们默认总会使用占位符,且无法取消。 Model: orm 包通过 struct tag 来描述 model 在数据库中的结构。大概格式如下: 目前支持以下的 struct tag: ApplyModeler: 用于将一个对象转换成 Model 对象时执行的函数,给予用户修改 Model 的机会, 在 ApplyModeler 中可以修改任意模型的内容,所以也可以由 ApplyModeler 代替 struct tag 的操作。 约束名: index、unique、check 和 fk 都是可以指定约束名的,在表中,约束名必须是唯一的, 即便是不同类型的约束,比如已经有一个 unique 的约束名叫作 name,那么其它类 型的约束,就不能再取这个名称了。 部分数据库(比如 postgres)可能要求约束名是整个数据库唯一的, 为了统一,在 ORM 中所有数据都强制约束名全局(数据库)唯一。 如何使用: Create: 可以通过 DB.Create() 或是 Tx.Create() 创建一张表。 Update: Delete: Insert: Select: Query/Exec: 事务: 默认的 DB 是不支持事务的,若需要事务支持,则需要调用 DB.Begin() 返回事务对象 Tx,当然并不是所有的数据库都支持事务操作的。 Tx 拥有一组与 DB 相同的接口。
Package orm 一个简单小巧的 orm 实现方案 目前内置了对以下数据库的支持: 其它数据库,用户可以通过实现 Dialect 接口,来实现相应的支持。 初始化: 默认情况下,orm 包并不会加载任何数据库的实例。所以想要用哪个数据库,需要手动初始化: 占位符 SQL 中可以使用以下占位符: 如: 在实际执行时,相关的占位符就会被替换成与当前环境想容的实例, 如在数据库为 mysql 时,会被替换成以下语句,然后再执行: [DB.Query]、[DB.Exec]、[DB.Prepare]、DB.Where 及 Tx 与之对应的函数都可以使用占位符。 Model 不能指定占位符,它们默认总会使用占位符,且无法取消。 Model: orm 包通过 struct tag 来描述 model 在数据库中的结构。大概格式如下: 目前支持以下的 struct tag: ApplyModeler: 用于将一个对象转换成 Model 对象时执行的函数,给予用户修改 Model 的机会, 在 ApplyModeler 中可以修改任意模型的内容,所以也可以由 ApplyModeler 代替 struct tag 的操作。 约束名: index、unique、check 和 fk 都是可以指定约束名的,在表中,约束名必须是唯一的, 即便是不同类型的约束,比如已经有一个 unique 的约束名叫作 name,那么其它类 型的约束,就不能再取这个名称了。 部分数据库(比如 postgres)可能要求约束名是整个数据库唯一的, 为了统一,在 ORM 中所有数据都强制约束名全局(数据库)唯一。 如何使用: Create: 可以通过 DB.Create() 或是 Tx.Create() 创建一张表。 Update: Delete: Insert: Select: Query/Exec: 事务: 默认的 DB 是不支持事务的,若需要事务支持,则需要调用 DB.Begin 返回事务对象 Tx,当然并不是所有的数据库都支持事务操作的。 Tx 拥有一组与 DB 相同的接口。
Package gostruct is an ORM that builds a package for a specific MySQL database table. A package with the underlying struct of the table will be created in the $GOPATH/src/models/{table} directory along with several methods to handle common requests. The files that are created in the package, for a 'User' model (for example) would be: User_base.go - CRUD operations and common ReadBy functions. It also validates any enum/set data type with the value passed to ensure it is one of the required fields User_extended.go - Custom functions & methods User_test.go - Serves as a base for your unit testing examples_test.go - Includes auto-generated example methods based on the auto-generated methods in the CRUX file It will also generate a connection package to share connection(s) to prevent multiple open database connections. Dependencies: Installation: Create a generate.go file with the following contents (including your db username/password): Then, run:
Package orm 一个简单小巧的 orm 实现方案 目前内置了对以下数据库的支持: 其它数据库,用户可以通过实现 Dialect 接口,来实现相应的支持。 初始化: 默认情况下,orm 包并不会加载任何数据库的实例。所以想要用哪个数据库,需要手动初始化: 占位符 SQL 语句可以使用 # 字符在语句中暂替真实的表名前缀,也可以使用 {} 包含一个关键字,使其它成为普通列名,如: 在实际执行时,相关的占位符就会被替换成与当前环境想容的实例,如在表名前缀为 p_, 数据库为 mysql 时,会被替换成以下语句,然后再执行: DB.Query(),DB.Exec(),DB.Prepare().DB.Where() 及 Tx 与之对应的函数都可以使用占位符。 Model 不能指定占位符,它们默认总会使用占位符,且无法取消。 Model: orm 包通过 struct tag 来描述 model 在数据库中的结构。大概格式如下: 目前支持以下的 struct tag: ApplyModeler: 在 Go 不能将 struct tag 作用于结构体,所以为了指定一些表级别的属性, 只能通过接口的形式,在接口方法中返回一段类似于 struct tag 的字符串, 以达到相同的目的。 在 ApplyModeler 每种数据库可以指定一些自定义的属性,这些属性都将会被保存到 Model.Meta 中,各个数据库的自定义属性以其名称开头,比如 mysql 的 charset 属性, 可以使用 mysql_charset。 同时还包含了以下几种通用的属性信息: 约束名: index、unique、check 和 fk 都是可以指定约束名的,在表中,约束名必须是唯一的, 即便是不同类型的约束,比如已经有一个 unique 的约束名叫作 name,那么其它类 型的约束,就不能再取这个名称了。 部分数据库(比如 postgres)可能要求约束名是整个数据库唯一的, 为了统一,在 ORM 中所有数据都强制约束名全局(数据库)唯一。 如何使用: Create: 可以通过 DB.Create() 或是 Tx.Create() 创建一张表。 Update: Delete: Insert: Select: Query/Exec: 事务: 默认的 DB 是不支持事务的,若需要事务支持,则需要调用 DB.Begin() 返回事务对象 Tx,当然并不是所有的数据库都支持事务操作的。 Tx 拥有一组与 DB 相同的接口。
Package gostruct is an ORM that builds a package for a specific MySQL database table. A package with the underlying struct of the table will be created in the $GOPATH/src/models/{table} directory along with several methods to handle common requests. The files that are created in the package, for a 'User' model (for example) would be: User_base.go - CRUD operations and common ReadBy functions. It also validates any enum/set data type with the value passed to ensure it is one of the required fields User_extended.go - Custom functions & methods User_test.go - Serves as a base for your unit testing examples_test.go - Includes auto-generated example methods based on the auto-generated methods in the CRUX file It will also generate a connection package to share connection(s) to prevent multiple open database connections. Dependencies: Installation: Create a generate.go file with the following contents (including your db username/password): Then, run:
Package db is a way to interface with sql databases as more than just simple data stores. At the moment, it is an ORM-like in an alpha state. A Connection is both a sql.DB connection to an active database and a mechanism for translating that database connection into structs. Structs can be configured by the Connection.Config mechanism or struct tags for special cases. Mappers turn rows from sql tables into structs. Mappers can be used to save structs to databases or retrieve subsets of the table using scopes. Scopes are implemented on Mappers, which return a Queryable that you can then chain off of to further filter the results that would be returned with RetrieveAll. Scopes are useful for more than just filtering results, you can also act on them. You will be able to pull out specific attributes into arrays of simple types. For example you should be able to run the following code to get a list of users who meet certain conditions and pull back their email addresses. Either way would work. Option 1 Option 2 But wait there's more. You can also run delete or update statements from scopes. You can update via a column and value, a map of columns to values, or straight sql. You can also run a sql delete from a scope. Scopes are used for more than just that. Has Many relations can have both an array of related structs, and a scope that are filled in by the retrieval process. Calling user.Posts.Save(post) would set the user relation on the post before saving it. user.Posts.Where(...) would start with a queryable scoped to the user's posts before applying the rest of the scope. Start building an environment by calling NewConnection with you dialect name ("mysql", "sqlite", "postgres") the name of the database to use, and the connector string for the database adapter (document this). There is code to manage Transactions using Connections, this isn't well supported and should be removed if it is not well supported or semi-supported until EphemeralConnections come around. Mappers are created by running CreateMapper on a Connection. You will receive back a Mapper object that you can then use to retrieve database rows, save structs into the database and create scopes of the struct. Mappers can also save structs to the database using the SaveAll function. You can pass either a single instance or multiple instances to it, and it will use the primary key value of the passed instance(s) to determine whether it needs to update existing records or create new records. Mapper+'s are like mappers, but they are designed to be part of a user defined struct, that the user then defines their own Scopes on, where each custom scope would be composed of 1 or more regular scopes. The main difference between a Mapper and a Mapper+ is that Mappers return a Scope when you call a Queryable method on it, while Mapper+ will return a new Mapper+ for the first scope, and then all further scopes will be applied to the Mapper+ object. The reason for that is so that user structs do not have to be continually casted to or created, the Scopes simply add to the current Scope. When you need to duplicate a Mapper+ scope, you could use Identity, but that will return you a Scope, not a MapperPlus. To assist in this situation, the MapperPlus interface has a Dupe method that will return a MapperPlus for you to use for this situation. Scopes are the cornerstone of db. Scopes are the common case for creating SQL queries. Scopes come in different forms, depending on what you are wanting to accomplish. For instance, lets say I needed all students who have attended at least 1 class and have a score of 90 on the 3 tests they've taken. Or perhaps you would rather see the top 5 most popular posts on your blog from the articles you released in the past month. For detailed descriptions of each Scope function, please see the Queryable interface documentation. There are multiple ways to retrieve data and map the data into struct instancess. The Find function takes two parameters, the primary key of the record you want and a pointer to the struct instance you want to map to. The Find function may start from Mappers, Scopes and Mapper+'s. Note that the Find will still respect any conditions on the Scope or Mapper+ if you are calling it from one of them. The Retrieve function takes 1 parameter, the struct instance to map the first records data into. If there are more than 1 records that would be returned from the current Scope, Mapper, or Mapper+, then the first record will be the mapped record. The RetrieveAll function takes 1 parameter, which is a pointer to an array of the struct you want to map into. You can save slices of new structs into the database using a Mapper using the SaveAll call. You can also save single instances of structs as well using SaveAll, but you will need to pass a pointer to the struct instance, so the mapper can update the instance with the primary key assigned to that struct. You can also update columns in the database off of a Scope or a Mapper. There are three functions, UpdateAttribute, UpdateAttributes, and UpdateSql that will to this for you. UpdateAttribute takes a column name and a value, and will then update that column to the value for all the database rows that would match the scope. UpdateAttributes takes a map of column names to values so you may update more than 1 column at once. UpdateSql takes a sql fragment and will allow you to write sql that uses sql functions instead of using dumb values. UpdateSql will be less used when db.Formula objects are implemented. UpdateSql is not yet implemented as well. The Count method allows you to retrieve a count of the rows that would be retrieved from a Scope or Mapper. The Pluck method allows you to retrieve a selected column from a Scope, Mapper, etc. It is then mapped into a simple array value that was passed as the second value. The CountOn method is a user controlled version of Count. If you would like to specify a specific column, perhaps to do a DISTINCT count on, this is what you want. The PluckSeveral is similar to Pluck, but allows you to specify multiple parameters and arrays to map results into. It uses a string array for the first parameters, then a variable amount of pointers to the arrays for the data. The Select function allows you to map specially selected columns and/or formulas into purpose-written or anonymous structs. If a table has many columns, or you are returning quite a bit of data, this can be a performance boost to use special structs instead of the default mapper. There are also TableInformation and ScopeInformation interfaces. I would caution use of the two interfaces at the moment, as they are intended to be improved heavily before a stable release of db. A stable version of db will provide a comprehensive informational interface for both Scopes and Mappers, but there are more pressing features than it at the moment. If your use case involves significant use of the database, instead of using the database as a simple persistence mechanism, you will enjoy the Mixin functionality offered by db. When you add the db.Mixin struct as an embedded field to your sturcts, you will have the ability to Save, Delete, and UpdateAttribute(s) from struct instances directly instead of having to use the mapper objects. Mixins need to be initialized explicitly, this can be done by sending the instances individually, as a slice, or any number of individual instances to the mapper for that sturct type's Initialize function. You can also initialize individual instances by calling that instances Init function with a pointer to the instance. This is only required if you are constructing your instances manually and not using the Find/Retrieve/RetrieveAll Scope/Mapper functions. Find, Retrieve, and RetrieveAll will all initialize the instances they retrieve if the instances have Mixin instances. Instances do not need to be resident in the database for Initialization to succeed. Instances also don't need to be initialized to be saved using the Mapper.SaveAll function. While joining in db can be divided multiple ways, the simplest division may be the division between automatic joins and manual joins. Manual Joins may be specified by the user in the joins query and may add specifiers to the join call, or may be joining on non-intuitive columns. Automatic joins are discovered during mapping by db and can the be retrieved using the mapper or mixin, or using the Include Scope method. Manual scopes are intended for use either in cases when you need a filtering that is created from the existence of the join, or you need to select columns/formulas/etc. from the query using the Select method of retrieval. Automatic joins are declared as part of the struct, and then can be used in Join calls by simply passing in a string or mapper corresponding to the joined struct. See an example below. By default, joins are implemented as outer joins, but you can default specific joins to be inner joins in the sql statment by setting the struct tag of db_join to be inner. You can also use the alternative Join function, InnerJoin to have the join run as an inner join. Finally, if you have set a db_join to default to inner, but want it to be a outer join instead, you can use the OuterJoin function. The FullJoin function allows you to retrieve records that don't have a match to the primary mapped struct. You pass the normal Join paramerters, but add a pointer to an array of the struct you are asking to be joined, which will be filled with the non-matching records when the first Retrieve/RetrieveAll call is made If you need to use functions to be evaluated by the sql server as part of conditions, you can pass a formula created with the Func function. Func's can have their own parameters, which you should specify using ?'s to denote where the values should appear. Where scopings do not respect Func's at the moment, but they will in the future. The Col function allows you to specify a column to be used as a parameter in the same manner as a value or Func. A Dialect creates a way for db to talk to a specific RDBMS. The current internal ones are mysql and sqlite3, with postgres planned for the near future. You can replace existing dialects or add your own dialects by writing a struct that corresponds to the Dialect interface and then calling RegisterDialect with the name you want the dialect to be accessible under and an instance of your dialect struct. Before a public announcement of a db version, I need to implement the Logging facilities. It won't be difficult, but it takes time. Time that I haven't invested yet.
sqlb パッケージは SQL 操作のユーティリティを提供します. sqlb は ORM (Object-Relational Mapping) のような大規模な仕組みではなく、 Go 標準パッケージの database/sql を容易に扱うためのユーティリティ群です. MySQL で使用する場合 次の import を追加してください. SQL を動的に組み立てる仕組みに Sqler インターフェイスを導入しています. Sqler は SQL 文字列が必要になったときに Writer に SQL を出力していくことで 高速かつメモリ効率よく SQL を生成します. 動的な SQL を簡潔に記述できる T 関数, M 関数を提供しています. これらの関数は SQL テンプレートに値や識別子, SQL を展開をできます. 構文は非常にシンプルながらとても柔軟かつ強力です. 値の展開: @ 1つの値を展開: 特別な展開: 識別子の展開: # 1つの識別子を展開: SQL の展開: $ 擬似イコール構文: == @, !== @