赏金更新:已经从 Mark 那里得到了非常好的答案。将 := 改编成 :,如下所示。但是,除了 DBIx 之外,我仍在寻找类似的方案。我只是想与任何东西兼容。
我需要关于我为参数化 SQL 语句中的“扩展”占位符选择的语法的建议。因为构建一些构造(IN 子句)困扰着我,所以我决定使用一些语法快捷方式,这些快捷方式可以自动扩展为普通的 ?占位符。
我喜欢他们。但我想打包分发,并问自己它们是否易于理解。
基本上我的新占位符是 ?? 和 :? (枚举参数)和 :& 和 :, 和 :| 和 ::(用于命名占位符)具有以下用例:
-> db(" SELECT * FROM all WHERE id IN (??) ", [$a, $b, $c, $d, $e])
?? 扩展为 ?,?,?,?,?,... 取决于我的 db() 函数的 $args 的数量。这个很清楚,它的语法已经标准化了。 Perls DBIx::Simple 也使用它。所以我很确定这是一个可以接受的想法。
-> db(" SELECT :? FROM any WHERE id>0 ", ["title", "frog", "id"]);
// Note: not actually parameterized attr, needs cleanup regex
承认吧。我只是喜欢笑脸。基本上这个 :? 占位符将关联的 $args 扩展为普通列名。事实上,它会丢弃任何 $args 值。它实际上对与 ?? 结合使用的 INSERT 很有用,有时对 IN 子句也很有用。但是在这里我已经在想这个新语法是否合理,或者不仅仅是用词不当,因为它混合了 : 和 ?人物。但不知何故,它似乎与语法方案很匹配。
-> db(" UPDATE some SET :, WHERE :& AND (:|) ", $row, $keys, $or);
此处助记符 :, 扩展为 name=:name 对列表,由 , 逗号分隔。而 :& 是由 AND 连接的 column=:column 列表。对于奇偶校验,我添加了 :|。不过,:& 在 UPDATE 命令之外还有其他用例。
但我的问题不是关于有用性,而是如果 :, 和 :& 看起来好记?
-> db(" SELECT * FROM all WHERE name IN (::) ", $assoc);
虽然我也添加了一些 :: 来插入一个 :named,:value,:list 非常像 ?? 扩展到?,?,?。相似的用例,并且为了统一起见是明智的。
不管怎样,有没有其他人实现过这样的计划?不同的占位符?或者为了简单起见,您会推荐哪个? 更新: 我知道 PHP Oracle OCI 接口(interface)也可以绑定(bind)数组参数,但不使用特定的占位符。我正在寻找可比较的占位符语法。
最佳答案
我喜欢您提案背后的基本思想,但不喜欢占位符的“命名”。我基本上有两个反对意见:
: 开头或 ? .您应该选择一种形式,以便可以立即识别占位符。我会选择 ?因为它与 SQL 的冲突可能性较小,并且更常用于表示占位符。:&和 :|对我来说似乎是合理的,但要区分?? , :?和 :很难。我改变了我的 DB class支持更多占位符并更加智能:DB_intelligent.php (README中关于占位符的部分不适用于此类,仅适用于普通类。)
DB类有两种占位符:多功能?占位符和关联数组占位符 ?x ( x 可能是 , 、 & 或 | )。
?占位符:此占位符根据参数的类型确定插入的类型:
null => 'NULL'
'string' => 'string'
array('foo', 'bar') => ('foo','bar')
?x占位符:数组中的每个元素都转换为 `field`='value'结构并用定界符内爆。分隔符由 x 指定组件:,用逗号分隔,&通过 AND和 |通过 OR .
示例代码:
DB::x(
'UPDATE table SET ?, WHERE value IN ? AND ?&',
array('foo' => 'bar'),
array('foo', 'bar'),
array('hallo' => 'world', 'hi' => 'back')
);
// Results in this query:
// UPDATE table SET `foo`='bar' WHERE value IN ('foo','bar') AND `hallo`='world' AND `hi`='back'
我在设计这个版本的 DB 类时的一些想法:
可能会出现一个明显的想法:为什么不使用 ?对于所有 类型的数据,甚至是关联数组。仅添加 ?&和 ?|此外。使用 ?在关联数组上与使用 ?, 相同在目前的设计中。我没有这样做的原因是安全。您经常希望从 <select multiple> 中插入数据进入查询(IN ?)。但是由于 HTML 允许排列 (form[array]) 表单控件,因此也可以提交具有相同名称的关联数组。因此,我的查询合成器会将其识别为字段 => 值列表。尽管这可能不会损害安全性,但它会导致严重的 SQL 错误。
关于php - SQL 的扩展占位符,例如ID 在哪里(??),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3696327/
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration
假设我有模型Topics和Posts,其中Topichas_many:posts和Postbelongs_to:topic。此时我的数据库中已经有了一些东西。如果我进入Rails控制台并输入Topic.find(1).posts我相信我得到了一个CollectionProxy对象。=>#]>我可以对此调用.each以获得枚举器对象。=>#]:each>我对CollectionProxy如何处理.each感到困惑。我意识到它在某些时候是继承的,但我一直在阅读API文档,他们并没有说得很清楚CollectionProxy是从什么继承的,除非我遗漏了一些明显的东西。Thispage似乎并没有
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"
这个问题有两个部分。在RubyProgrammingLanguage一书中,有一个使用模块扩展字符串对象和类的示例(第8.1.1节)。第一个问题。为什么如果您使用新方法扩展类,然后创建该类的对象/实例,则无法访问该方法?irb(main):001:0>moduleGreeter;defciao;"Ciao!";end;end=>nilirb(main):002:0>String.extend(Greeter)=>Stringirb(main):003:0>String.ciao=>"Ciao!"irb(main):004:0>x="foobar"=>"foobar"irb(main):