访问一个结构查询数据库
我在超传://源码仓库.组模/亚当多/arsd的源码仓库包含一个为我的SQL,大象SQL,小库,和通过开库连接的微软结构查询服务器的数据库.d接口文件和实现文件.这儿,我们将用他们来处理一些结构查询.
准备
从我的源码仓库下载数据库.d和驱动文件(大象数据库.d针对大象SQL,我的sql.d针对我的SQL,简库.d针对小库,或微软结构查询.d针对结构查询服务器).
驱动也要求C库.我的sql.d文件需要静态库伴随我的SQL服务器的我的sql客户.大象数据库.d文件需要伴随大象SQL服务器的静态库pq.简库.d文件需要安装在系统的小库.
我们也创建一个测试数据库来从程序中用.在我们例子中,我们将用我的SQL,所以创建一个我的SQL数据库,用户,和数据表.如下是你可在我的SQL控制台运行的命令:
创建数据库示范;
用示范
在示范.*上答应所有特权到'测试'确定的'示例_用户'@'本地主机';
创建表信息(标识整数动_增量,名变量符(80),年龄整数无效,主要键(标识))符集=utf8;
如何做...
我们执行以下步骤访问一个结构查询数据库:
导入驱动器模块,在我们的例子,arsd.我的sql.
用特定目标形参实例化对象.我的SQL接受主机名,用户名,密码,和数据库名.小库要文件名.大象SQL和MS结构查询都用在他们中的形参带连接串.
对任何数据形参使用问号作为占位符通过数据库接口查询
用每一或区间接口处理结果行.整数位置或名串可访问每列.
代码如下:
运行程序将加数据到表并打印如下文字.注意第一个标识的年龄如何为空串;这是在结果行如何展示无效.输出如下:
如程序抛出异常,它可能是因为未正确创建数据库.
提示
通过连接用户数据串避免构建结构查询串.这易错且可导致结构查询注入漏洞.相反,总是从库用参数化查询或从数据库引擎的本地应用接口的准备语句.
它如何工作...
这些文件从数据库供应商包装C应用接口来通过抽象接口提供最小,但功能,访问数据库服务器.数据库.d文件将不会跨数据库供应商转换结构查询语法的不同,但它将展现统一接口来查询.
数据库.查询的实现分为两个部分:第一,公查询方法,其是个可带任何数字及实参类型混合的可变元;第二,查询实现方法,其是个每个驱动器实现的虚函数.有必要分割是因为模板不能为虚且都通用且方便的函数,为接受大量数据类型必须是模板.
注意
老版本的数据库.d尝试用运行时可变函数来允许虚方法带可变实参类型.它工作,但仅有时-因为运行时可变函数需要检查每个它支持类型的具型给定这个限制,它不能简洁支持所有类型,而给它传递不支持类型将导致运行时异常而不是编译时错误!可变元和虚方法分割解决方案导致将在编译时正确支持所有类型的更短,更易代码.
公查询方法迭代其实参并把他们转换成标.变量.变量数组,随后为数据库引擎在参数化查询中使用,把变量传递给查询实现.随后,在你查询的串代表的每个占位符?或?n,前者拉下个实参而后者拉特殊编号实参-由下个实参值替代.
查询方法返回一个是行输入区间的结果集接口.结果集也是个每个数据库引擎不同实现的接口.作为输入区间,它可用空的属性检查数据,用前属性提取的当前行,和用弹前方法提取的下行.为简单迭代所有结果它也同每一语句工作.理论上,像其他输入区间也能用标.算法转换它.然而,实际上,你应该在数据库自身用你结构查询查询过滤和排序.
行对象是一个串数组和列名映射组成的构.感谢符号重载,可通过列名串和列索引整数用列值,类似PHP旧的我的sql_获取_数组函数工作.
串代表每个列主要是为了减轻数据库引擎实现并保持接口简单.作为串,可运行所有一般串操作,包含用长度属性检查无效或空或用标.转换.到把他们转换到其他类型.
当你用数据和数据库连接完成时,你可让垃圾收集器清理他们或你可用将立刻关闭连接的全局消灭方法显式消灭他们.
更多...
数据库.d文件为了构建查询也包含两个帮助对象:提供活动记录模式的简单实现的数据对象,和通过聚集独立组件帮你建造选择查询的选择生成器.
选择生成器的实现非常简单:仅仅是一个为限制语句的串数组和成员变量的集合.其至串方法连结数组至恰当顺序来建造一个工作查询.选择生成器目的是使修改,重用,和创造查询比再解析和胶接结构查询串更易.
代码如下:
那个程序将打印可传递给数据库.查询的如下构造查询:
数据对象使用op分发属性来为查询取置数据.取器属性返回一个可用标.转换.到转换为其他类型的串.置器属性是带各种实参的元并为了自动在查询中用把它转换到串.数据对象,像许多关系对象模型解决,在数据库中受竞技条件不适合所有情况.
数据库.d文件也包含实验性代码生成来创建基于结构查询创建表语句的数据对象的强类型子类.它带个结构查询串并解析它(用许多解析快捷方式)来提取列名和类型.随后,它把他们转换成D属性并混入为D代码的生成串,像我们在到在第9章,代码生成中静态类型接口案例中的鸭子类型上做的来实现子类.然而,因为解析器针对我写它们时的特定方法,它可能对你不管用.
最终,它也有在结构上使用编译时反射的代码来用查询填充他们.因为对我我发现串够用了,我极少用这个代码,结果,不维护它了.
另见
超传://代码.d语言.组织/包/ddb是个不用静态库pq并提供关系对象模型和其他高级功能的本地大象SQL驱动器
超传安://源码仓库.组模/拒绝软件/我的sql-本地是一个本地的不用我的静态库sql并整合情绪.d框架的我的SQL驱动器
同d标准库发布的模块等.c.简库3,绑定小库C库
领取专属 10元无门槛券
私享最新 技术干货