我知道我们可以使用以下命令增加varchar的大小:
alter table TABLE_NAME modify COLUMN_NAME VARCHAR(1024) NOT NULL;
假设我有10个表,每个表有一个公共列,即varchar,其名称为“title”。是否有任何查询我可以执行而不管表名是什么,它会在每个表中更新该字段的大小?
情景:
实际上我使用的BaseModel
是Abstract
,我的很多模特都是从那里继承的。现在我在我的基本模型中将标题长度更新为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")
答案 0 :(得分: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 ...
答案 1 :(得分: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
答案 2 :(得分:0)
我不会直接通过SQL来做...而是在所有模型中更改它(例如max_length = 1024)并使用South进行迁移 - &gt; http://south.readthedocs.org/en/0.7.6/tutorial/part1.html
南== awsomeness
另外,您可能需要将应用转换为使用南 - &gt; http://south.readthedocs.org/en/0.7.6/convertinganapp.html#converting-an-app
等。等