sqlalchemy.exc.DataError:(psycopg2.DataError)整数超出范围

时间:2015-07-13 23:06:17

标签: python postgresql sqlalchemy

我正在尝试通过SQLAchemy ORM将数据保存到postgresql中。我在下面遇到了一个错误:

  

sqlalchemy.exc.DataError:(psycopg2.DataError)整数超出范围

我找到了出错的地方。我有一个很大的数字是2468432255.0。如果我更改为较小的数字,如468432255.0,那么它可以工作。

让我感到困惑的是:我将列定义为volume = Column(Numeric)。据我所知,Numeric应该能够处理这么大的数字。另外,我尝试了其他数据类型,如BigInt等......他们都给了我同样的错误。

有什么想法吗?

谢谢, 成均

2 个答案:

答案 0 :(得分:1)

您可以在本地代码中的SQlAlchemy架构中定义所需的任何内容, 这并不意味着您将数据插入到数据库中。它将被尊重。

SQLAlchemy中定义的模式由代码本身强制执行。

虽然数据库有自己的模式,当你试图插入/删除等时也会强制执行它...(有自己的约束等等),SQLAlchemy一无所知(直到你声明它为止)。

在我看来,您可以自动生成SQLAlchemy架构 - 它将采用DB列名称&数据库架构中的类型。

from sqlalchemy import create_engine

class SomeTable(Base):
    """
    Class, that represents SomeTable
    """
    __tablename__ = "my_table_in_db"

    __table__ = Table(__tablename__, Base.metadata,
        autoload=True,
        autoload_with=create_engine(DB_URL))

在您创建SomeTable对象后,您只需

即可访问其列
SomeTable.colname

colname是当前存在于DB

中的列

答案 1 :(得分:0)

我得到了同样的错误 -

这是一些测试代码 - 使用对象界面时没关系,但是使用普通SQL进行炸弹:

from sqlalchemy import create_engine
from sqlalchemy import MetaData, Table, Column, BigInteger

dsn = 'postgres://postgres@localhost/testdb'

engine = create_engine(dsn)
metadata = MetaData(engine)

# create table
tbl = Table('test', metadata, Column('id', BigInteger))
tbl.drop(checkfirst=True)
tbl.create(checkfirst=True)

# use object chaining - works
cmd = tbl.insert().values(id=123456789012)
engine.execute(cmd)

# pass a dictionary of values - works
cmd = tbl.insert(values = dict(id=123456789013))
engine.execute(cmd)

# pass a list of values - works
cmd = tbl.insert(values = [123456789014])
engine.execute(cmd)

# use plain sql - bombs!
# error - sqlalchemy.exc.DataError: (psycopg2.DataError) integer out of range
# sql = "INSERT INTO test (id) VALUES (123456789015);"
# engine.execute(sql)

# show table contents
cmd = tbl.select(True)
result = engine.execute(cmd)
for row in result:
    print(row)
# (123456789012,)
# (123456789013,)
# (123456789014,)

# show table definition
for t in metadata.sorted_tables:
    print("Table name: ", t.name)
    for c in t.columns:
        print("  ", c.name, c.type)
# Table name:  test
#    id BIGINT

我不知道为什么会发生炸弹 - 在某些时候psycopg2必须尝试将bigint转换为int。