Используя нижеследующие классы и тестовую программу, я получаю неверную Вставку, где значение для 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.
Итак, каков вывод 'print (application.Id)' кортежа или простой 1? – metmirr
Просто равнина 1. – Clearer