Как сопоставить существующие таблицы в MS SQL с помощью SQLalchemy? - PullRequest
0 голосов
/ 25 марта 2020

Я использую 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, но все равно получаю ту же ошибку независимо от того, какие столбцы я заполняю или удаляю. Есть идеи, что я здесь не так делаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...