用反射来生成SQL的CREATE语句

下面的程序使用R纽约娱乐城eflection来构造"CREATE TABLE"的sql语句。如果你不是很熟悉反射机制,可以从这个程序中看看反射的魅力与作用。

<?php
/**
 * Creates an SQL ‘Create Table‘ based upon an entity
 *
 * @author Chris Tankersley <[email protected]>
 * @copyright 2010 Chris Tankersley
 * @package PhpORM_Cli
 */
class PhpORM_Cli_GenerateSql
{
    /**
     * Use a MySQL database
     */
    const MYSQL = ‘mysql‘;
    /**
     * Use a SQLite database
     */
    const SQLITE = ‘sqlite‘;
    /**
     * Types that are allowed to have a length
     * @var array
     */
    protected $_hasLength = array(‘integer‘, ‘varchar‘);
    /**
     * Regexes needed to pull out the different comments
     * @var array
     */
    protected $_regexes = array(
        ‘type‘ => ‘/ type=([a-z_]*) /‘,
        ‘length‘ => ‘/ length=([0-9]*) /‘,
        ‘default‘ => ‘/ default="(.*)" /‘,
        ‘null‘ => ‘/ null /‘,
    );
    /**
     * Types that we support
     * @var array
     */
    protected $_validTypes = array(
        ‘boolean‘ => ‘BOOL‘,
        ‘date‘ => ‘DATE‘,
        ‘integer‘ => ‘INT‘,
        ‘primary_autoincrement‘ => ‘INT AUTO_INCREMENT PRIMARY KEY‘,
        ‘text‘ => ‘TEXT‘,
        ‘timestamp‘ => ‘TIMESTAMP‘,
        ‘varchar‘ => ‘VARCHAR‘,
    );
    /**
     * Name of the class we will interperet
     * @var string
     */
    protected $_className;
    /**
     * Name of the table we are generating
     * @var string
     */
    protected $_tableName;
    /**
     * The type of database we are generating
     * @var string
     */
    protected $_type;
    /**
     * Sets the name of the class we are working with
     * @param string $class
     * @param string $table_name
     * @param string $type
     */
    public function __construct($class, $table_name, $type = self::MYSQL)
    {
        $this->_className = $class;
        $this->_tableName = $table_name;
        $this->_type = $type;
    }
    /**
     * Builds an SQL Line for a property
     * @param ReflectionProperty $property
     * @return string
     */
    protected function _getDefinition($property)
    {
        $type = ‘‘;
        $length = ‘‘;
        $null = ‘‘;

        preg_match($this->_regexes[‘type‘], $property->getDocComment(), $matches);
        if(count($matches) == 2) {
            if(array_key_exists($matches[1], $this->_validTypes)) {
                $type = $this->_validTypes[$matches[1]];
                if(in_array($matches[1], $this->_hasLength)) {
                    $length = $this->_getLength($property);
                }
                if($matches[1] != ‘primary_autoincrement‘) {
                    $null = $this->_getNull($property);
                }
                $sql = ‘`‘.$property->getName().‘` ‘.$type.‘ ‘.$length.‘ ‘.$null;
                return $sql;
            } else {
                throw new Exception(‘Type "‘.$matches[1].‘" is not a supported SQL type‘);
            }
        } else {
            throw new Exception(‘Found ‘.count($matches).‘ when checking Type for property ‘.$property->getName());
        }
    }
    /**
     * Extracts the Length from a property
     * @param ReflectionProperty $property
     * @return string
     */
    protected function _getLength($property)
    {
        preg_match($this->_regexes[‘length‘], $property->getDocComment(), $matches);
        if(count($matches) == 2) {
            return ‘(‘.$matches[1].‘)‘;
        } else {
            return ‘‘;
        }
    }
    /**
     * Determines if a Property is allowed to be null
     * @param ReflectionProperty $property
     * @return string
     */
    protected function _getNull($property)
    {
        preg_match($this->_regexes[‘null‘], $property->getDocComment(), $matches);
        if(count($matches) == 1) {
            return ‘NULL‘;
        } else {
            return ‘NOT NULL‘;
        }
    }
    /**
     * Generates a block of SQL to create a table from an Entity
     * @return string
     */
    public function getSql()
    {
        $class = new ReflectionClass($this->_className);
        $definitions = array();
        foreach($class->getProperties() as $property) {
            if(strpos($property->getName(), ‘_‘) === false) {
                $definitions[] = $this->_getDefinition($property);
            }
        }
        $columns = implode(",n", $definitions);

        $sql = "CREATE TABLE ".$this->_tableName." (".$columns.")";
        if($this->_type == self::MYSQL) {
            $sql .= " ENGINE=MYISAM";
        }
        return $sql.";";
    }
}
时间: 2024-10-18 23:26:17

用反射来生成SQL的CREATE语句的相关文章

SQL Server CREATE语句

1.CONTAINMENT SQL Server 2012 新功能 , 默认值是OFF .(太高级 书上也没有详细介绍). 2.ON ON用于两个地方,第一个是存储数据的文件的位置,第二个是存储日志的文件的位置. ON 后面的 PRIMARY的概念:希望将所有的内容存放在一个文件里. 3.NAME 一个逻辑名称,即SQL Server在内部使用该名称引用该文件.当需要修改数据库大小时,需要使用这个名称 4.FILENAME 实际的操作系统文件在磁盘的名字,如果不写默认放在安装SQL Server

利用反射生成SQL语句

// 修改学员信息的方法 public bool ModifyStudent(MODEL.Students model) { // 利用反映获取类对所有属性,用来动态生成SQL语句 StringBuilder sbSql = new StringBuilder("update Students set "); // 先获得model 的Type类型 Type modeType = model.GetType(); // 通过Type类型得到它所有的公开属性 PropertyInfo[]

模拟Hibernate动态生成SQL语句

这里有一个xml配置文件,也就是Hibernate框架中会用到的POJO和数据库的映射文件 1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://www.hibernate.org/dtd/hibernate-

动态产生和删除相关组件并生成SQL语句

(********************************************************************************************************** * * * 窗体描述:产生SQL条件语句,系统模块 [计划管理-打卡] 打印大/小卡 *           能够根据维护进去的条件,生成过软类型: 缸内过软.缸外过软.连续皂洗.空白 * * 关键功能点:1.动态产生和删除子/父等相关组件按钮(注意移动组件位置) *        

python读取excel表格生成sql语句 第一版

由于单位设计数据库表·,都用sql.不知道什么原因不用 powerdesign或者ermaster工具,建表很痛苦  作为程序猿当然要想办法解决,用Python写一个程序解决 需要用到 xlrd linux下 sudo pip install xlrd 主要是适用于db2数据库 excel 表结构 其中 number是不正确的字段类型 不知道同事为啥这么设置.这里程序里有纠错,这个程序就是将sql语句拼好. __author__ = 'c3t' # coding:utf-8 import xlr

使用注解生成sql语句

注解介绍: java SE5内置了三种,定义在java.lang中的注解: @Override,表示当前的方法定义将覆盖超类中的方法. @Deprecated,如果程序员使用了注解为它的元素,那么编译器会发出警告信息. @SuppressWarnings,关闭不当的编译器警告信息. 元注解 @Target 用来定义你的注解应用于什么地方,例如是一个方法或者一个域. CONSTRUCTOR :构造器的声明 FIELD : 域声明 METHOD :方法声明 PACKAGE : 包生明 TYPE :

【C#】通过反射生成sql

1.定义特性标志表或表字段 public class ExtendAttribute { /// <summary> /// 表示在自动生成SQL语句时,不处理该字段 /// </summary> [AttributeUsage(AttributeTargets.Property)] [Serializable] public class ExcludeFieldAttribute : Attribute { /// <summary> /// 获取元数据的特性 ///

手把手教你-----巧用Excel批量生成SQL语句,处理大量数据

在做系统或者做项目的时候,经常会遇到这样的要求:用户给我们发过来一些数据,要求我们把这些数据导入到数 据库中,对于少量的数据来说,用最原始的方法就可以解决,直接在SQL里面用语句来实现,但是如果有成千上万条的 数据呢?如果你还继续单独写SQL语句,估计写个几十条你就会有跳楼的冲动,其实有两种简单的方法: 1.将Excel的数据整理好,通过SQL的导入功能直接导入到数据库中,但是要保证数据库的字段和Excel的字段一致. 2.通过Excel生成相应的SQL语句,然后,放到SQL的新建查询中,执行.

NO2:自动生成sql语句

SQL语句自动生成工具 大哉乾元 2016/2/26   作者原创转载请注明出处 前言 这个程序是几年前做成的,现在整理成文档和大家分享,当时参与的项目中大量使用的sql语句,所以SqL语句的代码输入占了较大的比例,为了提高sql语句的书写正确性和输入效率,做成了这个自动生成工具. 一:ADO.NET中执行sql文,对应的sql语句嵌入到vb.net的代码内,分析sql的语法格式个特点: 已检索语句为例分析: A:必须是已select开头 B:检索的字段名(一些系统函数:可选,例如max,sum