d语言写的一个简单的sql生成器

简陋的封装了一些单表操作

源代码

template eval( A... )
{
const typeof(A[0]) eval = A[0];
}
char[] escape(char[] c){
return "\""~c~"\"";
}
char[] column_def(char[] temp){
return "typeof(this) " ~ temp ~ "(char[] v){ this.column[\"" ~ temp ~ "\"]=v;return this;}\n";
}

char[] table(char[] names)
{
char[] table="char[][char[]] column;\n";
char[] temp="";

foreach (c;names){
if(c==' '){
table ~=column_def(temp);
temp="";
}else{
temp~=c;
}
}
if(temp!="")table~=column_def(temp);
return table;
}

template Sql(char[] table_name,char[] column_list,char[] primary="id"){
//TODO:assert primary in column_list

mixin(table(column_list));

typeof(this) opAssign(T)(T t){
column=null;
foreach(k,v;t)column[k]=v;
return this;
}
char[] toString(){
char[] result=table_name~"\n";
foreach(k,v;column){
result~="\t"~k~" = "~v~"\n";
}
return result;
}
char[] save(){
if(primary in column)return update();
else return insert();
}

char[] update(){
assert(column[primary]!=null);
char[] list="";
foreach(k,v;column){
if(k!=primary)
list~=k~"="~escape(v)~",";
}
if(list!=""){
list=list[0..$-1];
}
return "UPDATE "~table_name~" SET "~list~" WHERE "~primary~"="~escape(column[primary])~";";
//UPDATE Person SET Address = 'Stien 12', City = 'Stavanger' WHERE LastName = 'Rasmussen'
}
char[] del(){
assert(column[primary]!=null);
return "DELETE FROM "~table_name~" WHERE "~primary~"="~escape(column[primary])~";";
}
char[] insert(){
char[] key_list="";
char[] value_list="";
foreach(k,v;column){
key_list~=k~",";
value_list~=escape(v)~",";
}
if(key_list!=""){
key_list=key_list[0..$-1];
value_list=value_list[0..$-1];
}
return "INSERT INTO "~table_name~"("~key_list~") VALUES("~value_list~");";
//INSERT INTO transcount_year(year, room_idx, dns_idx, redirip_id) VALUES(%d,%d,%d,%d);
}

static char[] where(char[] statement){
return "SELECT * FROM "~table_name~" WHERE "~statement~";";
}
static char[] all(){
return "SELECT * FROM "~table_name~";";
}
}

用法演示

class ErrDnameMonth{
mixin Sql!("conf_err_dname_month","id month dname dns_query_count web_hit_count");
}
void main(){

Cout(ErrDnameMonth.where("id=1")).newline.newline;

auto month=new ErrDnameMonth;

month
.month("12")
.dname("www.donews.net")
.dns_query_count("23242");

month.web_hit_count="124";

Cout(month.toString).newline.newline;
Cout(month.insert).newline.newline;
Cout(month.all).newline.newline;
Cout(month.save).newline.newline;


MysqlMgr mysql_mgr_;//假设这是一个数据库封装
Row[] rows;//取回的数据为字典格式
mysql_mgr_ = new MysqlMgr();
rows = mysql_mgr_.queryFetchAll(month.all);

foreach(r;rows){
auto em=new ErrDnameMonth;
em=r;
em.dns_query_count="23";
oo.format("{}",em.update).newline.newline;
oo.format("{}",em.del).newline.newline;
}

Cin.get();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值