Я использую SQLAlchemy для подключения к базе данных MS SQL, а затем я хочу отобразить существующую таблицу и внести в нее записи, используя ORM. Есть несколько причин, по которым я хочу использовать метод отображения вместо создания своего собственного класса, но главная из них заключается в том, что мне нужно хранить файлы XML, а SQLAlchemy не подходит для типа XML, который предоставляет MS SQL .
Вот описание того, что я пробовал и почему оно не работает:
Я устанавливаю соединение с базой данных, и они отображают таблицу таким образом:
engine = create_engine(conn_str, echo=True)
Base= declarative_base()
class MyClass(Base):
__table__ = Table('my_table_name', Base.metadata, autoload=True, autoload_with=engine)
При выполнении выдается исключение:
sqlalchemy.exc.ArgumentError: Mapper mapped class MyClass->my_table_name could not assemble any primary key columns for mapped table 'my_table_name'
При проверке таблицы в приложении Microsoft SSMS нет ни одного «ПЕРВИЧНОГО КЛЮЧА» ни в одном из столбцов, что странно. Я проверил каждый из столбцов и обнаружил, что столбец «Id» является столбцом IDENTITY, и я предполагаю, что он используется в качестве PK.
Я прочитал некоторые статьи в Google и в stackoverflow и обнаружил, что могу использовать аргументы mapper установить primary_key следующим образом:
class MyClass(Base):
__table__ = Table('my_table_name', Base.metadata, autoload=True, autoload_with=engine)
__mapper_args__ = {
'primary_key':[Table('my_table_name', Base.metadata, autoload=True, autoload_with=engine).c.Id,]
}
Это работает нормально, и нет исключений при выполнении кода. Я попытался сделать запись в таблице, используя новый сопоставленный класс:
new_entry = MyClass(
Id = 9999,
... all other not null objects
)
Session = sessionmaker(bind=engine)
session = Session()
session.add(new_entry)
session.commit()
session.close()
Я получил следующее исключение:
Cannot insert explicit value for identity column in table 'my_table_name' when
IDENTITY_INSERT is set to OFF. (544) (SQLExecDirectW)")
Я удалил столбец "Id" для new_entry, но все равно получаю ту же ошибку независимо от того, какие столбцы я заполняю или удаляю. Есть идеи, что я здесь не так делаю?