2017-01-24 3 views
0

Используя нижеследующие классы и тестовую программу, я получаю неверную Вставку, где значение для Application_Id записывается как '(n,)', где n значение, которое было вставлено, т. е. если Application_Id должно быть равным 2, значение «(2,») находится на своем месте.Почему SQLAlchemy создает вставку с неправильными значениями

Мне не удалось найти, почему это происходит, поскольку, насколько я вижу, нет никакой разницы в том, как обрабатываются другие столбцы внешнего ключа. (все импортируемые товары исключены - это не проблема).

Я использую Python 3.4.4 и SQLAlchemy 1.1.5 на Windows 10 + Visual Studio 2015. Переключение на другую ОС или IDE не вариант :-(

TimeSpan

class Timespan(Base): 
    """ 

    """ 
    __tablename__ = 'timespan' 
    def __init__(self, start, end, account, application, language): 
     self.StartTime = start 
     self.EndTime = end 
     self.Account_Id = account 
     self.Application_Id = application, 
     self.Language_Id = language 

    StartTime = Column(DateTime) 
    EndTime = Column(DateTime) 
    Id = Column(Integer, primary_key = True) 
    Account_Id = Column(Integer, ForeignKey('account.Id')) 
    Application_Id = Column(Integer, ForeignKey('application.Id')) 
    Language_Id = Column(Integer, ForeignKey('language.Id')) 

Применение

class Application(Base): 
    """ 

    """ 
    __tablename__ = 'application' 
    Id = Column(Integer, primary_key = True) 
    Code = Column(String) 
    Description = Column(String) 

    def __init__(self, code, description): 
     self.Code = code 
     self.Description = description 

Счет

class Account(Base): 
    """ 

    """ 

    __tablename__ = 'account' 

    def __init__(self, uid, domain): 
     self.MvidDomain = domain 
     self.MvidUid = uid 

    Id = Column(Integer, primary_key = True) 
    MvidUid = Column(Integer) 
    MvidDomain = Column(String) 

Язык

class Language(Base): 
    """ 

    """ 
    def __init__(self, description, code): 
     self.Description = description 
     self.Code = code 

    __tablename__ = 'language' 

    Id = Column(Integer, primary_key = True) 
    Description = Column(String) 
    Code = Column(String) 

Тестовая программа

class TimespanTest(TestCase): 
    def test_insert(self): 
     engine = create_engine('sqlite://', echo = True) 
     Base.metadata.create_all(engine) 

     Session = sessionmaker(bind = engine) 
     session = Session() 
     application = Application(code = 'itw', description = 'desc') 
     lang = Language(description = 'test language', code = 'da') 
     account = Account(uid = 'test_user', domain = 'test_domain') 

     session.add(lang) 
     session.add(application) 
     session.add(account) 
     session.commit() 

     print (lang.Id) 
     print (application.Id) 
     print (account.Id) 

     timespan = Timespan(
       datetime.today(), datetime.today(), 
       account = account.Id, 
       application = application.Id, 
       language = lang.Id) 
     session.add(timespan) 
     session.commit() 

выход отладки/Исключение:

(sqlite3.InterfaceError) Error binding parameter 3 - probably unsupported type. 
[SQL: 'INSERT INTO timespan ("StartTime", "EndTime", "Account_Id", "Application_Id", "Language_Id") VALUES (?, ?, ?, ?, ?)'] 
[parameters: ('2017-01-24 08:29:23.447994', '2017-01-24 08:29:23.447994', 1, (1,), 1)] 

Проблемы находится во втором, чтобы последний параметр, т.е. значение (1,), который должно быть просто 1.

+0

Итак, каков вывод 'print (application.Id)' кортежа или простой 1? – metmirr

+0

Просто равнина 1. – Clearer

ответ

3

У вас есть проблема в Временной интервал Класс, Примечание , после = приложение, удалите это и сработайте. Вот код, удаливший запятую: -

class Timespan(Base): 
    """ 

    """ 
    __tablename__ = 'timespan' 
    def __init__(self, start, end, account, application, language): 
     self.StartTime = start 
     self.EndTime = end 
     self.Account_Id = account 
     self.Application_Id = application 
     self.Language_Id = language 

    StartTime = Column(DateTime) 
    EndTime = Column(DateTime) 
    Id = Column(Integer, primary_key = True) 
    Account_Id = Column(Integer, ForeignKey('account.Id')) 
    Application_Id = Column(Integer, ForeignKey('application.Id')) 
    Language_Id = Column(Integer, ForeignKey('language.Id'))