3

我正在为我的应用程序的数据库编写大量迁移脚本。我想为专栏添加评论,以便其他人可以轻松识别专栏的内容。一种选择是编写普通的 SQL 查询并添加注释。但是有没有办法可以在 Migration scipt 中添加这些评论?

$this->dbforge->add_field(array(
  'post_id' => array(
    'type' => 'INT',
    'constraint' => 11,
    'unsigned' => true,
    'auto_increment' => true,
    'comment' => 'Unique post id'
  ),
  'user_id' => array(
    'type' => 'INT',
    'constraint' => 11,
    'unsigned' => true,
  ),
  'group_id' => array(
    'type' => 'INT',
    'constraint' => 11,
    'unsigned' => true,
  ),
  'source' => array(
    'type' => 'VARCHAR',
    'constraint' => 20
  ),
  'data' => array(
    'type' => 'TEXT',
  ),
  'created' => array(
    'type' => 'INT',
    'constraint' => 11,
    'unsigned' => true,
  ),
  'updated' => array(
    'type' => 'INT',
    'constraint' => 11,
    'unsigned' => true,
  ),
  'status' => array(
    'type' => 'INT',
    'constraint' => 1,
    'unsigned' => true,
  )
));

这是我编写的基本代码。可能有一些语法错误。但我只是复制粘贴。

任何人都可以请帮忙。

4

3 回答 3

6

CodeIgniter 在 3.0 版本中添加了此功能。您可以使用“评论”键添加评论:

'first_name' => [
    'type'       => 'VARCHAR',
    'constraint' => 45,
    'null'       => false,
    'comment' => 'Put the field comment here',
]
于 2019-11-24T17:54:53.950 回答
1

具体来说,查看 CodeIgniter 核心,system/database/drivers/mysql/mysql_forge.php该字段似乎COMMENT不受支持。

作为参考,这里是解析字段数组的函数:

function _process_fields($fields)
{
    $current_field_count = 0;
    $sql = '';

    foreach ($fields as $field=>$attributes)
    {
        // Numeric field names aren't allowed in databases, so if the key is
        // numeric, we know it was assigned by PHP and the developer manually
        // entered the field information, so we'll simply add it to the list
        if (is_numeric($field))
        {
            $sql .= "\n\t$attributes";
        }
        else
        {
            $attributes = array_change_key_case($attributes, CASE_UPPER);

            $sql .= "\n\t".$this->db->_protect_identifiers($field);

            if (array_key_exists('NAME', $attributes))
            {
                $sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' ';
            }

            if (array_key_exists('TYPE', $attributes))
            {
                $sql .=  ' '.$attributes['TYPE'];

                if (array_key_exists('CONSTRAINT', $attributes))
                {
                    switch ($attributes['TYPE'])
                    {
                        case 'decimal':
                        case 'float':
                        case 'numeric':
                            $sql .= '('.implode(',', $attributes['CONSTRAINT']).')';
                        break;

                        case 'enum':
                        case 'set':
                            $sql .= '("'.implode('","', $attributes['CONSTRAINT']).'")';
                        break;

                        default:
                            $sql .= '('.$attributes['CONSTRAINT'].')';
                    }
                }
            }

            if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE)
            {
                $sql .= ' UNSIGNED';
            }

            if (array_key_exists('DEFAULT', $attributes))
            {
                $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\'';
            }

            if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE)
            {
                $sql .= ' NULL';
            }
            else
            {
                $sql .= ' NOT NULL';
            }

            if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE)
            {
                $sql .= ' AUTO_INCREMENT';
            }
        }

        // don't add a comma on the end of the last field
        if (++$current_field_count < count($fields))
        {
            $sql .= ',';
        }
    }

    return $sql;
}
于 2014-11-03T03:43:14.917 回答
0

您可以在 up 方法的结束标记之前执行以下操作:

$this->db->query("ALTER TABLE `" . $this->db->dbprefix . $this->table_name . "` CHANGE `post_id` `post_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Unique post id'");

在不包括 MySQL 中的列定义的情况下,有没有其他方法可以做到这一点?

注意

更改注释将导致表的完全重建。因此,您可以选择在非常大的桌子上不使用它。

最好的解决方案是创建、扩展或复制mysql 或 mysqli并重新实现_process_fields以处理字段的注释。链接可以帮助您入门,是高级链接。

于 2015-05-11T13:17:09.207 回答