Я использую SQLAlchemy для выполнения операторов SQL в различных базах данных и пытаюсь найти способ определить, является ли оператор SQL (переданным в коннектор в виде строки python). Каков наилучший способ сделать это надежно для нескольких разновидностей SQL?
raw_query = "SELECT * FROM table"
engine = get_engine(username=db_dict['username'],
password=db_dict['password'],
db=database,
hostname=db_dict['hostname'],
port=port,
db_type=db_dict['type'])
with engine.connect() as db_conn:
# query database
result = db_conn.execute(sqlalchemy.text(raw_query))
В приведенном выше, как лучше всего проверить, потребует ли SQL в raw_query больше разрешений, чем только чтение? Или, другими словами, будет ли он вносить изменения в базу данных.
1 ответ
В большинстве случаев, когда вы запускаете операторы sql через некоторые библиотеки, вы должны получить количество измененных полей, созданных полей или что-то еще в качестве возвращаемого значения.
Например: updatePayload := bson.M{...} результат, err := db.[tablename].UpdateByID(ctx.Context, updatedID, bson.M{"$set": updatePayload})
If result.ModifiedCount == 0 { continue // это означает, что ни одно поле не было обновлено. }
Я уверен, что у SQLAlchemy есть и аналогичные функции.
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.
SELECT
. Некоторые регулярные выражения, такие как(^SEL|^SELECT)\s
, могут помочь, но, очевидно, не поймают что-то вродеSELECT * FROM sometable; UPDATE sometable SET somecolumn=NULL;
.SELECT INTO
, что может быть мутативным, несмотря на использованиеSELECT
. Однако - это очень похоже на проблему XY - если вы в каком-то отношении обеспокоены мутациями базы данных из-за ненадежного пользовательского ввода, вам, вероятно, следует немного больше подумать о своей архитектуре безопасности.