我正在尝试通过SQLAchemy ORM将数据保存到postgresql中。我在下面遇到了一个错误:
sqlalchemy.exc.DataError:(psycopg2.DataError)整数超出范围
我找到了出错的地方。我有一个很大的数字是2468432255.0。如果我更改为较小的数字,如468432255.0,那么它可以工作。
让我感到困惑的是:我将列定义为volume = Column(Numeric)。据我所知,Numeric应该能够处理这么大的数字。另外,我尝试了其他数据类型,如BigInt等......他们都给了我同样的错误。
有什么想法吗?
谢谢, 成均
答案 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。