【问题标题】:Convert data_type of table to MEDIUMTEXT or LONGTEXT from Flask-SQLAlchemy从 Flask-SQLAlchemy 将表的 data_type 转换为 MEDIUMTEXT 或 LONGTEXT
【发布时间】:2021-01-09 21:54:30
【问题描述】:

MySQL Text 类型大小为 64KB

如果我想创建一个更大的文本表,例如 MEDIUMTEXT 或 LONGTEXT。

我试过String('big number')的方法,比如String(1000000),它只适用于SQLAlchemy,不适用于Flask-SQLAlchemy

那么,问题出在 Flaks-SQLAlchemy 中吗?还是有什么问题?

使用前

如:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Post(db.Model):
    title = db.Column(db.String(60))
    body = db.Column(db.Text())

当前使用情况,它有效!

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Post(db.Model):
    title = db.Column(db.String(60))
    body = db.Column(db.Text(10000000))

Text() 中较大的数字将自动在 MySQL 中创建大文本数据类型。 10000000 将转换为长文本。

【问题讨论】:

    标签: python mysql sqlalchemy pymysql


    【解决方案1】:

    我试过这个测试:

    t2 = Table('t2', metadata,
          Column('id', Integer, primary_key=True),
          Column('t1', String(64000)),
          Column('t2', String(16000000)),
          Column('t3', String(4294000000)),
          Column('t4', Text)
         )
    
    metadata.create_all(engine)
    

    然后我检查了它最终在 MySQL 数据库中创建了什么:

    mysql> show create table t2;
    CREATE TABLE `t2` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `t1` mediumtext,
      `t2` longtext,
      `t3` longtext,
      `t4` text,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    

    所以它确实将 SQLAlchemy 的通用 String 数据类型映射到或多或少合适的 MySQL 数据类型。

    (以上内容是从我 2017 年对https://stackoverflow.com/a/47644801/20860 的回答中复制而来的。从那以后我没有做过这个测试。)

    【讨论】:

    • 谢谢!我知道这适用于 SQLAlchemy。但是我用的是Flask-SQLAlchemy,不知道在CentOS服务器上通过Flask-SQLAlchemy和pymysql实现这个效果。
    • 可能问题出在 pymysql 上。因为我本地测试没有错误。
    • 好吧,我没有意识到 Flask-SQLAlchemy 是一个不同的实现。无论如何,上面的答案至少是一个测试用例。祝你好运!
    • 谢谢!你给我一个想法,让我多想。 64000 > 64KB,所以它将是中文本。我认为 Flask-SQLAlchemy 不支持这种转换方式。
    • 我尝试使用 Text(100000) 或更大的数字,它可以工作!
    【解决方案2】:

    我尝试使用 Text(10000000) 来转换它。幸运的是,它有效!

    我查看了我的 MySQL,它很好,pymysql 没有错误

    mysql> SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='post' and COLUMN_NAME = 'body';
    +-----------+
    | DATA_TYPE |
    +-----------+
    | text      |
    | longtext  |
    +-----------+
    

    那么,我的问题就完成了!

    【讨论】:

      猜你喜欢
      • 2012-05-19
      • 2020-03-27
      • 2013-07-09
      • 2017-02-01
      • 1970-01-01
      • 2018-01-29
      • 2011-03-31
      • 2020-01-20
      • 1970-01-01
      相关资源
      最近更新 更多