`
achun
  • 浏览: 314298 次
  • 性别: Icon_minigender_1
  • 来自: 河南郑州
社区版块
存档分类
最新评论

参考MongoDB输入格式的SQL生成器 by PHP

    博客分类:
  • PHP
阅读更多

(需要php 5.3.x)这几天参考MongoDB的传入参数格式 find({a:1,$or:{c:1,b:2}}) 这样的表示方法,写了个由这种传入方法对数据进行解析 并输出带分析数据的array,以便后续class使用 不知道这种设计方法是否实用,里面的注释有可能写的不对,毕竟自己复制粘贴自己的也很多 源代码参见附件,这里贴出测试数据的结果以便表明我要做什么,欢迎交流指点 (贴个代码咋就这么难)

Array
(
    [parameters] => Array
        (
            [p11] => 1
            [p12] => foo
            [p13] => 1
            [p14] => 3
        )

    [into] => t1
    [write] => (`a`=:p11,`c`=:p12)
    [detail] => Array
        (
            [where] => Array
                (
                    [c] => 1
                    [a] => 1
                )

        )

    [query] =>  `c` = :p13  and `a` = :p14 
    [sql] => UPDATE `t1`  `c` = :p13  and `a` = :p14  SET (`a`=:p11,`c`=:p12) WHERE  `c` = :p13  and `a` = :p14 
)
0
0
分享到:
评论
6 楼 achun 2011-06-21  
yeaha 写道
> DataMapper的问题主要是和业务逻辑结合太紧密,说白了就是每一个业务逻辑都是特例代码
没那么累,我给你看看我的DataMapper实现

https://github.com/yeaha/lysine/blob/master/framework/orm/datamapper.php
https://github.com/yeaha/lysine/tree/master/framework/orm/datamapper

实际使用例子
https://github.com/yeaha/lysine/blob/master/demos/rbac/model/user.php

每个Data可以定义自己的Mapper,也可以使用现成的Mapper,不一定非要每个Data对应一个Mapper

学习下
5 楼 yeaha 2011-06-21  
> DataMapper的问题主要是和业务逻辑结合太紧密,说白了就是每一个业务逻辑都是特例代码
没那么累,我给你看看我的DataMapper实现

https://github.com/yeaha/lysine/blob/master/framework/orm/datamapper.php
https://github.com/yeaha/lysine/tree/master/framework/orm/datamapper

实际使用例子
https://github.com/yeaha/lysine/blob/master/demos/rbac/model/user.php

每个Data可以定义自己的Mapper,也可以使用现成的Mapper,不一定非要每个Data对应一个Mapper
4 楼 achun 2011-06-21  
yeaha 写道
我猜测你的设计目的是提供一个通用的语法结构,成为sql的超集,兼容不同的sql标准。
程序里面使用通用的语法结构,以后即使切换数据库,也可以转换成为sql本地语言,不需要改程序。

但是这样设计的问题在于:
.....

是的,你猜的很对,不过我没有那么大的目标,只要支持几种常用的数据库就达到我的目标了
比如MySQL,SQLite,
而且在设计里面我采用的是独立class,也就是说每个都是独立设计的,根本不搞继承,以达到接口的特异性支持,你的回答让我确认了,目前还没有这样的成品,我就是怕已经有了成熟的东西,我还再这里重复造轮子。
DataMapper的问题主要是和业务逻辑结合太紧密,说白了就是每一个业务逻辑都是特例代码,这和手工代码已经区别不大了,这个应该在极其特殊的业务逻辑里面使用,而不能解决统一接口问题
感谢您的回复,我继续按这个思路进行,不求大而全。能支持大部分就好,20,80法则,特殊的还是要特别的设定sql,这个目前是没有好的解决方法的。
3 楼 yeaha 2011-06-21  
我猜测你的设计目的是提供一个通用的语法结构,成为sql的超集,兼容不同的sql标准。
程序里面使用通用的语法结构,以后即使切换数据库,也可以转换成为sql本地语言,不需要改程序。

但是这样设计的问题在于:
1、各种不同的sql特性其实是非常繁杂的,维护通用性其实会非常的困难。而且对这个超集的抽象和归纳基本上不太可能,到最后总会发现某些特例会超出原先的设计范畴。
2、使用了这种通用语法结构之后,丧失了灵活性,实际使用时,一些比较复杂的查询可能要绕不少弯子才能达到目的
3、读代码之前非得先熟悉这个语法结构才行,提高了维护和理解门槛

我认为提供一个通用的数据库中间层,以后即使切换到其它数据库,改改配置就好这件事情基本上属于神话,除非你的应用特别简单,否则都不太可能。

所以努力的方向不应该是不改程序,而是如何少改程序,不改是不可能的。

一个解决方案就是DataMapper,把逻辑跟存储隔离开。Adapter层面的差异是天然的,不应该抹掉,抹掉了反而不灵活,不自然。这种差异应该延迟到DataMapper的Mapper这个层面来解决。面向对象,抽象和封装就是用来解决这种问题的。
2 楼 achun 2011-06-21  
xieye 写道
zend框架的select类可以组合sql

我也尝试去看了多种框架的数据库查询支持情况,只要是用ActiveRecord的都对复杂查询支持的不好(也许我没有找到方法),我这个方案是通过传入参数的结构(参照Mongodb)来生成复杂查询的SQL语句的,比如
WHERE  ( ( `a` > :p1  and `c` in (:p2,:p3)) or ( ( ( `s` = :p4 ) or ( `a` = :p5 )) and (`cca` % ?   in (:p6,:p7,:p8))))

这种复杂条件ActiveRecord如何才能实现呢?
1 楼 xieye 2011-06-21  
zend框架的select类可以组合sql

相关推荐

    MongoDB底层类生成器

    MongoDB底层类生成器是一个辅助工具,它根据主键名称自动生成DBHelper类,帮助开发者更便捷地操作数据库,尤其适合对MongoDB初学者。 在关系型数据库中,我们通常会使用ORM(对象关系映射)框架来简化数据操作,而...

    mongodb sql语句速成

    mongodb与mysql SQL语句区别: ex: select * from users db.users.find();

    SqlServer数据导入MongoDB

    2. 数据转换:根据MongoDB的数据模型,可能需要将SQL Server的表格数据转换为JSON格式。可以使用各种工具或编程语言(如Python、Java、C#等)实现此转换。例如,Python有pymongo库,可以方便地操作MongoDB,同时可以...

    greenleaf:MongoDB的简单查询生成器

    :seedling: greenleaf-用于MongoDB的简单,类型安全且易于使用的查询生成器 安装 要安装使用: go get github.com/slavabobik/greenleaf 快速范例 package main import ( "context" "github....

    Go-golangmgo代码自动生成器生成对mongodb的CRUD操作代码

    3. **运行生成器**:执行代码生成器,指定输入的数据模型和输出目录。生成器会根据你的模型自动生成CRUD操作的函数,如`Insert()`, `Find()`, `Update()`, `Remove()`等。 4. **整合到项目**:将生成的代码引入到你...

    MongoDB常用SQL操作.pdf

    作为文档型数据库的代表,MongoDB使用的是BSON(一种类似JSON的二进制形式)格式存储数据,它与传统的关系型数据库如MySQL使用的SQL语言操作方式有所不同。 MongoDB的集合对应于SQL数据库中的表,文档则对应于表中...

    mongo2SQL:Mongodb 查询到 sql 查询转换器

    Mongodb 查询到 sql 查询转换器。 示例:在:db.user.find({name: 'julio'}); out: SELECT * FROM user WHERE name = 'julio'; 在:db.user.find({_id: 23113},{name: 1, age: 1}); out: SELECT name, age FROM ...

    sql-to-mongodb:将SQL表转换为MongoDB集合的Java工具

    sql到mongodb 将SQL表转换为MongoDB集合的Java工具 轻松将 MSSQL 表转换为 MongoDB。 从下载 SQL Server JDBC 驱动程序 将 SQLJDBC4.jar 文件放在同一文件夹中。 一次指定 TABLE NAME 和 NUMBER OF ROWS 进行导入...

    windows服务自动定时启动SQLServer同步数据到MongoDB.zip(c#源代码)

    本软件使用c#编写,是SQL转存MongoDB的工具,可独立运行,也可定时运行,利用sql数据库时间戳字段进行更新采集区分。 本软件综合了,windows服务控制(安装卸载等),windows服务启动程序(服务控制定时运行程序),...

    delphi所有笔记,还有mongodb innosetup sql等

    MongoDB支持JSON格式的数据存储,这使得它在处理非结构化和半结构化数据时非常灵活。你还会学到如何使用MongoDB Shell进行数据管理,以及如何通过驱动程序在各种编程语言(包括Delphi)中与MongoDB交互。 Innosetup...

    mongodb No-SQL 数据库

    MongoDB是一种流行的No-SQL数据库,它以快速简洁著称,并且在性能上远胜于传统的SQL Server Database。在美国,许多大型科技公司如谷歌和脸书都在使用MongoDB。No-SQL数据库,也被称为非关系型数据库,是近几年随着...

    Mongodb参考手册

    在本手册中,您将了解到MongoDB的基本概念、操作、参考信息以及版本和修订信息。本手册将介绍如何贡献到文档中、报告问题或请求更改、MongoDB的文档项目。我们还会涉及到MongoDB的接口、内部元数据、配置数据库、...

    MongoDB常用SQL操作

    1. **数据模型**:MongoDB基于JSON(JavaScript Object Notation)格式的文档存储数据,这使得它能够存储复杂的数据结构,如嵌套对象和数组。 2. **连接MongoDB**:在Java中,我们需要使用`MongoClient`类建立到...

    MongoDB_参考手册

    ### MongoDB参考手册精要 **MongoDB**,作为NoSQL数据库的一种,因其灵活性、高性能以及扩展性而备受青睐。此份“MongoDB参考手册”旨在为开发者提供全面深入的指导,涵盖从入门到精通的各个阶段,是学习与运用...

    mongodb 副本集php文件样例,php连接mongodb

    mongodb 副本集php文件样例,php连接mongodb

    MongoDB参考手册-新

    1. **MongoDB基础**:MongoDB使用JSON格式的数据结构,称为BSON(Binary JSON),这使得数据存储更高效。数据库、集合和文档是MongoDB的三大基本概念。数据库是数据的容器,集合是无模式的表,文档则是集合中的数据...

    一种基于ANTLR的MongoDB数据库SQL转化模型.pdf

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,可以用来读取、处理、执行或翻译结构化文本或二进制文件。它是基于语法的,并能够为编译器的构建提供完整的解决方案,包括语法分析、语义...

    php windows下安装mongodb服务

    在Windows环境下,PHP与MongoDB的集成是许多开发者在构建基于文档数据库的应用程序时的常见需求。本教程将详述如何在WAMP(Windows、Apache、MySQL、PHP)服务器环境中安装PHP的MongoDB扩展,并将其配置为系统服务...

    MongoDB参考手册.zip

    MongoDB以JSON格式的文档作为数据存储单元,这种数据模型被称为BSON(Binary JSON)。每个文档由键值对组成,键是字符串,值可以是各种类型,包括数字、字符串、数组、嵌套文档等。这使得MongoDB能够处理复杂的数据...

Global site tag (gtag.js) - Google Analytics