SQLAlchemy中的BIGINT和BigInteger有什么区别?

5

大整数

class BigInteger(Integer):

    """A type for bigger ``int`` integers.

    Typically generates a ``BIGINT`` in DDL, and otherwise acts like
    a normal :class:`.Integer` on the Python side.

    """

    __visit_name__ = 'big_integer'

BIGINT

class BIGINT(BigInteger):

    """The SQL BIGINT type."""

    __visit_name__ = 'BIGINT'

但是 Column(BigInteger) 和 Column(BIGINT) 都可以工作,它们都在postgresql中定义了一个bigint。如何区分它们?


1
相关:https://dev59.com/r6zka4cB1Zd3GeqP8WwI - Ilja Everilä
1个回答

9

这两种方法都可以使用,但是 BIGINT 必须从特定方言中导入,例如在您的情况下是 postgres。如果您将数据库更改为例如 mysql,则可能会遇到问题。对于 BigInteger,sqlalchemy 会根据您使用的数据库来处理映射,因此您应该优先选择这种方法。


BIGINT真的是方言特定的吗?文档说它是SQL类型:基础:sqlalchemy.types.BigInteger SQL BIGINT类型。我个人仍然困惑如何选择SQL类型与SQLAlchemy类型。 - shiouming
我现在明白了。BIGINT是标准SQL类型,就像其他原始数据类型一样,应该得到大多数主流DBMS的支持。但是...并不是所有标准SQL类型都被广泛实现,例如BLOB、DATE、NCHAR,因此sqlalchemy类型具有其优势。 - shiouming
@shiouming:使用 ORM 的整个想法就是做出“最不具体”的决策,并让 ORM 根据您的数据库选择最佳类型。根据文档,BigInteger 通常被映射到一个 sql 大整数上,而 BIGINT 则总是被映射到一个大整数上(这可能是之前 SQLAlchemy 版本中的遗留问题)。还有一些供应商特定版本,比如 mysq.BIGINTpostgres.BIGINT。除非这是一个仅由特定数据库支持的类型(例如 postgres 中的 int[]),否则没有理由使用它们。 - blue_note
同意,我也不认为需要使用方言特定的BIGINT。我来到这篇文章后意识到我的代码混用了SQL INTEGER和SQLAlchemy Integer,我已经将它们全部改成了Integer。 - shiouming

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接