`
zuroc
  • 浏览: 1302601 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

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();
}
分享到:
评论

相关推荐

    SQL数据库生成器

    软件名称:SQL数据库生成器 软件版本:2.0 软件作者:梅文海 作者邮件:TQuery@163.com 软件网站:software.jinluo.com.cn 下载地址:http://software.jinluo.com.cn/download/download.asp?id=230 软件容量...

    存储过程生成器所需Sql语言

    存储过程是数据库管理中的一个重要工具,它可以提高性能,减少网络流量,并提供更好的安全性。本文将详细介绍如何使用SQL语言来创建和管理存储过程,以及如何获取表的相关信息。 首先,我们要了解如何获取表的结构...

    曾经写过的生成器源代码

    5. **SqlEntityGenerator**: 这可能是一个SQL数据库实体生成器,能够根据数据库表结构自动生成对应的C#实体类。这在ORM(对象关系映射)开发中很常见,可以极大地提高开发效率。 6. **WinP2WinCEP**: 文件名可能...

    mssql 生成.sql文件

    在压缩包中提到的`mssql2.exe`和`mssql 生成器`可能就是这样一个第三方工具,它可以简化.mssql文件到.sql文件的转换过程。使用这类工具时,通常需要指定数据库连接信息、选择要导出的对象以及设置脚本选项,然后工具...

    用yacc和lex实现SQL解释器

    yacc(Yet Another Compiler-Compiler,另一种编译器-编译器)和lex(lexical analyzer generator,词法分析器生成器)是用于生成编译器和解释器的工具,它们分别用于生成语法分析器和词法分析器。接下来,我们将...

    生成类别随机数

    在SQL Server中,`NEWID()`是一个内置函数,用于生成一个唯一标识符(GUID)。该函数通常用于创建唯一的记录标识,特别是在需要为表中的行提供唯一值的情况下。然而,当需要生成一系列随机数时,`NEWID()`可能不是最...

    动软.Net代码生成器 v2

    Maticsoft 自动化智能软件系列 ≡≡≡≡≡≡≡≡≡≡≡≡...此版本是一个开发中的版本,一些功能尚未彻底完成,难免有一些bug,如有问题请及时反馈。 可以发邮件至maticsoft@sohu.com 或者来 bbs.maticsoft.com交流。

    Python-HeidiSQL一个用于管理MySQLMSSQL和PostgreSQL的图形客户端

    下面是一个简单的Python脚本示例,用于连接到MySQL数据库并执行查询: ```python import subprocess # 使用subprocess运行HeidiSQL cmd = "heidisql -u username -p password -h localhost -d database -e 'SELECT...

    DBA常用SQL语句

    - `next_extent`: 下一个区的大小,单位为KB。 - `max_extents`: 最大区数。 - `cur_ext`: 当前区数。 #### 四、查看某个回滚段里面正在执行的事物或SQL语句 该SQL语句用于监控某个特定回滚段内的活动,如正在执行...

    sql建立视图的过程

    在SQL语言中,视图(View)是一种虚拟表,它并不实际存储数据,而是通过一个SELECT语句来定义,这个语句可以从一个或多个实际存在的表中选择数据。视图的作用在于提供了一种数据抽象的方式,可以简化复杂的查询,...

    实验五-SQL语言.doc

    ### 实验五-SQL语言知识点解析 #### 一、实验目的与要求 1. **掌握SQL语言的查询功能**: - SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言。 - 查询功能是SQL的核心之一,通过SELECT...

    Microsoft SQL Server 2005 Express Edition SP3

    例如,下列路径值为“C:\Program Files (x86)\”的脚本将生成一个错误,因为 shell 脚本解释器会将扩展的 PATH 变量中的括号错误地解释为 IF/ELSE 语句的一部分: IF "%SOME_PATH%" == "" ( SET PATH=%PATH%;%...

    SQL_最实用的学习资料没有之一

    #### 一、SQL 语句整理大全 **1. 查看某个回滚段中的事务或SQL语句** - **语法:** ```sql SQL> SELECT D.SQL_TEXT, A.NAME FROM V$ROLLNAME A, V$TRANSACTION B, V$SESSION C, V$SQLTEXT D WHERE A.USN = B....

    lemon语法分析器

    LR(1)和LALR(1)分别代表“Look-Ahead Left-to-Right”分析器,其中的数字1表示分析器在做出决策时会查看一个额外的输入符号。 1. **LR(1)**:在每个状态,LR(1)分析器会考虑当前的输入符号和下一个符号的前缀,以此...

    builder:用于Go语言的轻量级快速SQL构建器,已移至https:gitea.comxormbuilder

    SQL生成器 包构建器是用于Go和XORM的轻量级且快速SQL构建器。 确保已安装Go 1.8+,然后: go get github.com/go-xorm/builder插sql , args , err := builder . Insert ( Eq { "c" : 1 , "d" : 2 }). Into ( "table1...

    Sql Server2000 快捷键

    - **SHIFT+F2**: 在编辑器中查找下一个匹配项。 - **ALT+BREAK**: 将当前窗口拆分为两个窗口,方便同时查看多个部分。 - **CTRL+O**: 打开一个已存在的文件。 - **CTRL+F4**: 关闭当前活动的窗口。 - **CTRL+F4**: ...

    SQL Server 2000数据库程序设计

    - **选项D**: 创建一个应用程序,此应用程序使用SQL_DM_O提取数据库的数据并把这些数据转换为标准电子数据交换(EDI)文件。EDI文件是一种专门用于业务交易的标准格式,但在这种情况下可能过于复杂且不够灵活。 **...

Global site tag (gtag.js) - Google Analytics