On 10/11/2013 06:25 PM, Dicebot wrote:
The very point of proposal is to not have any UDA's when information is already enough - same as it done in various vibe.d modules, configuration by convention.
I thought about extra fields in UserListItem that are not part of the 
query result.
But after some more thought, I'm actually actually wondering whether 
binding a fixed query to a type is a good idea in the first place, 
because the type mainly serves as carrier of the UDA metadata.
     @dbexpr("FROM user ORDER BY username ASC")
     struct UserListItem
     {
         @dbexpr("user_id")
         int user_id;
         @dbexpr("username")
         string username;
     }
     const users = db.queryExpr!UserListItem;
IMHO a throwaway tuple type made more sense for a single query.
db.select!(Tuple!(int, "user_id", string, "username"))("FROM user ORDER 
BY username ASC");
If your targeting to express SQL schemata it should be more declarative, 
maybe like so.
/// name of table
struct table { string name; }
/// optional: name of column in table
struct column { string name; }
/// primary key constraint
struct primaryKey {}
/// unique constraint
struct unique {}
/// references a foreign key
struct foreignKey(alias column) { alias key = column; }
@table("user")
struct User
{
     @primaryKey
     int id;
     string name;
     @column("bar") @unique
     string foo;
     @foreignKey!(City.name)
     string city;
}
@table("city")
struct City
{
     @primaryKey
     string name;
}
The declaration should give you enough information to implement the 
following SQL statements.
db.select!("id", "name").from!User;
db.select.from!User;
db.select.from!User.orderBy!("name")(Order.ascend);
db.insertInto!User(User(0, "dawg", "code@dawg.eu", "Berlin"));
db.select.from!User.where!("id <=")(20);
db.select.from!User.where!("name LIKE")("foo*");