Получение ошибки привязки параметра 0 - возможно, неподдерживаемый тип при использовании конструктора для создания объектов - PullRequest
1 голос
/ 16 марта 2020

Я пытаюсь сохранить записи с помощью 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()

Но я получаю сообщение об ошибке: 1004 *

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

Я что-то упустил?

1 Ответ

1 голос
/ 16 марта 2020

Если вы полностью избавитесь от своего конструктора и измените вызов создания Budgets, он будет работать:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...