获取绑定参数0时出错-使用构造函数创建对象时可能不支持类型



我正在尝试使用sqlalchemy存储记录。这是我的代码

from sqlalchemy import create_engine, Column, Integer, Numeric, ForeignKey, String, Unicode
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
Base = declarative_base()

class Budgets(Base):
__tablename__ = 'budgets'
id = Column(Integer, primary_key=True)
userid = Column(String(20), nullable=False)
amount = Column(Numeric(19, 4), nullable=False)
def __init__(self, userid, amount):
self.userid = userid,
self.amount = amount

engine = create_engine('sqlite:///budgetNew.db', echo=True)
#Base.metadata.create_all(bind=engine)
session = sessionmaker(bind=engine)
session = session()
budget1 = Budgets('123234', 300)
session.add(budget1)
session.commit()
session.close()

但我在说时出错了

sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) Error binding parameter 0 - probably unsupported type.
[SQL: INSERT INTO budgets (userid, amount) VALUES (?, ?)]
[parameters: (('123234',), 300.0)]

我是不是错过了什么?

如果您完全摆脱构造函数并更改预算创建调用,它将起作用:

from sqlalchemy import create_engine, Column, Integer, Numeric, ForeignKey, String, Unicode
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
Base = declarative_base()

class Budgets(Base):
__tablename__ = 'budgets'
id = Column(Integer, primary_key=True)
userid = Column(String(20), nullable=False)
amount = Column(Numeric(19, 4), nullable=False)
engine = create_engine('sqlite:///budgetNew.db', echo=True)
#Base.metadata.create_all(bind=engine)
session = sessionmaker(bind=engine)
session = session()
budget1 = Budgets(userid='123234', amount=300)
session.add(budget1)
session.commit()
session.close()

如果由于某种原因需要重写构造函数,可以这样做:

class Budgets(Base):
# [...]
def __init__(self, *args, **kwargs):
super(Budgets, self).__init__(**kwargs)
self.userid = args[0]
self.amount = args[1]
# and then call
budget1 = Budgets('123234', 300)

但即使在这种情况下,我也宁愿只使用**kwargs,也宁愿这样做,因为这遵循sqlalchemy习惯:

def __init__(self, **kwargs):
super(Budgets, self).__init__(**kwargs)
# whatever else is needed
# and then call
budget1 = Budgets(userid='123234', amount=300)

最新更新