0

我知道我们可以使用以下命令增加 varchar 的大小:

alter table TABLE_NAME modify COLUMN_NAME VARCHAR(1024) NOT NULL;

假设我有 10 个表,每个表都有一个公共列,即 varchar,其名称为“title”。无论表名如何,我都可以执行任何查询,并且它会更新每个表中该字段的大小?

设想:

实际上我使用了一个BaseModelwhich isAbstract并且我的许多模型都继承了它自己。现在我在我的基础模型中将标题长度更新为 500。执行 Manage.py syncdb 不会反映这些更改。所以这就是为什么我需要上面的查询。

class TitleAndSlugModel(models.Model):
    title = models.CharField(max_length=500)
    slug = models.SlugField(null=True, blank=True, help_text="The part of the title that is used in the url")
4

3 回答 3

0

不,但如果只有 10 张左右的桌子,实际上并不难做到。

#!/bin/bash
{
  echo "USE some_database;"
  for table in TABLE1 TABLE2 ...
  do
    echo "alter table `$table` modify COLUMN_NAME VARCHAR(1024) NOT NULL;"
  done
} | mysql -h ... -u ... -p ...
于 2012-08-08T15:36:46.440 回答
0

您可以使用 information_schema 将 DDL 语句转储到 SQL 脚本中,然后获取脚本以执行它。假设您的列上没有任何字符集、排序规则或其他覆盖,您可以执行以下操作:

-- alter all varchar columns named title to be varchar(1024)
select concat('ALTER TABLE ',table_schema,'.',table_name,
' MODIFY COLUMN ',column_name,' VARCHAR(1024)',
if(IS_NULLABLE='YES',' NULL',' NOT NULL'),';"') as the_ddl 
into outfile '/tmp/modify_title_columns.sql'
from information_schema.columns 
where table_schema = '<your_schema>' 
and column_name = 'title'
and data_type = 'varchar';

\. /tmp/modify_title_columns.sql
于 2012-08-08T15:43:34.467 回答
0

我不会直接通过 SQL 执行此操作...而是在所有模型中更改它(例如 max_length=1024)并使用 South 进行迁移 --> http://south.readthedocs.org/en/0.7.6 /tutorial/part1.html

南方==可怕

此外,您可能需要将您的应用程序转换为使用 South --> http://south.readthedocs.org/en/0.7.6/convertinganapp.html#converting-an-app

等等等等

于 2012-08-08T16:58:31.213 回答