Вы, кажется, создалось впечатление, что SQLAlchemy может работать только с структура базы данных, созданная SQLAlchemy (возможно, с использованием MetaData.create_all()
) - это неверно. SQLAlchemy может отлично работать с уже существующей базой данных, вам просто нужно определить ваши модели в соответствии с таблицами базы данных. Один из способов сделать это, чтобы использовать отражение, а Ilja Everilä предлагает:
class MyClass(Base):
__table__ = Table('mytable', Base.metadata,
autoload=True, autoload_with=some_engine)
(который, на мой взгляд, было бы совершенно нормально для одноразовых сценариев, но может привести к невероятно разочаровывает ошибок в «реальном» приложение, если есть потенциал, который может изменить структура базы данных с течением времени)
Другой способ - просто определить ваши модели, как обычно, чтобы определить ваши модели в соответствии с таблицами базы данных, что не так сложно. Преимущество этого подхода заключается в том, что вы можете сопоставить только подмножество таблиц базы данных для ваших моделей и даже только подмножество столбцов таблицы для полей вашей модели. Предположим, у вас есть 10 таблиц в базе данных, но только заинтересован в users
таблицу из которой вам нужно только id
, name
и email
поля:
class User(Base):
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String)
email = sa.Column(sa.String)
(обратите внимание, как нам не нужно определить некоторые детали, которые нужны только для испускать правильный DDL, например длину полей String или тот факт, что поле email
имеет индекс)
SQLAlchemy не будет генерировать запросы INSERT/UPDATE, если вы не создадите или не измените модели в своем коде. Если вы хотите, чтобы ваши запросы были доступны только для чтения, вы можете создать специального пользователя в базе данных и предоставить только привилегии пользователя SELECT. В качестве альтернативы/кроме того, вы также можете поэкспериментировать с откатом транзакции в коде приложения.
Вы бы использовать [отражения] (http://docs.sqlalchemy.org/en/latest/core/reflection.html), и [automap] (http://docs.sqlalchemy.org/en/latest/orm/extensions/automap.html), если вы хотите работать с сопоставленными классами. –