【问题标题】:Using a blob as primary key in SQLAlchemy with MySQL Database在带有 MySQL 数据库的 SQLAlchemy 中使用 blob 作为主键
【发布时间】:2018-04-22 04:03:37
【问题描述】:

我有一个数据库,其中主键应该是 256 字节的数据,这是我从另一个应用程序获得的 ID。

我的问题是 SQLAlchemy 不输出主键的长度参数,即使它涉及的字段在使用 create_all 时指定了它。

型号

class Route(db.Model):
    assignmentId = db.Column(db.Binary(256), primary_key=True, nullable=False)

我尝试过的事情

  • 在 PrimaryKey 表选项中提供 mysql_length,但这会被拒绝,因此不起作用。错误:

sqlalchemy.exc.ArgumentError: Argument 'mysql_length' is not accepted by dialect 'mysql' on behalf of <class 'sqlalchemy.sql.schema.PrimaryKeyConstraint'

  • 通过手动输出包含所需长度参数的 SQL 语句来创建表(有效,但我真的很想避免像那样回避 ORM)

  • 其他没有任何结果的东西

我知道,我的问题相当具体,但我们非常感谢您对解决方案的任何帮助。谢谢:)

【问题讨论】:

    标签: python mysql database sqlalchemy flask-sqlalchemy


    【解决方案1】:

    我试过了,效果很好:

    class Test(db.Model):
        __tablename__ = 'test'
        assignmentId = db.Column(db.BINARY(64), primary_key=True, nullable=False)
        name = db.Column(db.String(64))
    

    结果:

    MariaDB [ioc_eventdb]> describe test;
    +--------------+-------------+------+-----+---------+-------+
    | Field        | Type        | Null | Key | Default | Extra |
    +--------------+-------------+------+-----+---------+-------+
    | assignmentId | binary(64)  | NO   | PRI | NULL    |       |
    | name         | varchar(64) | YES  |     | NULL    |       |
    +--------------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    

    【讨论】:

    • 感谢您再次帮助我!遗憾的是,您的方法仅适用于长度低于 255 个字符的列,因为 BINARY 不允许更多,而我的 ID 为 256 个字符长,需要 BLOB :(
    【解决方案2】:

    我没有 sqlalchemy 的答案。然而:

    您是否会遇到外部应用程序(除了您的 python 应用程序)更新数据的情况。如果是,那么您需要在数据库中指定约束。

    如果是您的应用程序将控制数据库,您始终可以确保在将输入保存到数据库之前验证应用程序中的输入。

    【讨论】:

    • 我还检查了应用程序的有效性,但主键约束应该充当安全网,并且被指定,所以我可能不得不使用它。
    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多