Я пытаюсь быстро загрузить данные из inte rnet в таблицу, используя Flask, SQLAlchemy с PostgreSQL / psycopg2. Я немного спорю с коллегой. Мы будем называть его "папа". Папа утверждает, что мы не можем выполнить необработанный запрос SQL из-за возможности внедрения SQL. Я утверждаю, что мы можем, если он, вероятно, отформатирован, что сложно сделать, и обычно следует использовать ORM. Следующий пример кажется мне достаточно простой проблемой.
# Flask-SQLAlachemy
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
server = Flask(__name__)
server.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
server.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://...'
db = SQLAlchemy(server)
@server.route('/<column>')
def index(column):
result = db.session.execute("SELECT" + column + "from item_profit")
return render_template('index.html', data=result)
Кто-то может вставить любой необработанный SQL в столбец и вернуть эту таблицу. Смотрите эту ссылку для других простых инъекций. Я видел этот SO ответ (см. Второй ответ), который, по-видимому, подразумевает, что правильно отформатированная строка не приведет к инъекции SQL. Их код выглядит так:
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
Папа говорит, что администраторы баз данных в довольно многих компаниях не позволяют другим отделам иметь полномочия на исполнение ie, которые они не смогут использовать
result = db.session.execute("...")
Я думаю, это потому, что они обеспокоены тем, что обычный пользователь не будет знать, как правильно его отформатировать. Это верно? Дело не в том, что выполнение запроса SQL может вызвать внедрение SQL, а в том, что запрос выполнения, отформатированный неправильно , может вызвать его. Вот почему люди говорят, что следует использовать ORM, потому что он постоянно обеспечивает правильно отформатированные запросы. Это правильное мышление? Системы ORM просто выполняют закулисную работу. Если выполнение запроса было проблемой внедрения, то даже ORM нельзя было использовать. Черт, даже SQL не может быть использовано, правильно? Я надеюсь использовать raw SQL в некоторых случаях, так как мы могли бы иметь дело с огромными наборами данных, скорость обработки которых является основным фактором, а ORM намного, намного медленнее.
Тогда я задаюсь вопросом: лучший способ загрузить CSV в базу данных SQL при минимизации сырых SQL? Папа импортировал CSV в postgres, используя импорт PgAdmin (экономит много времени на выписывание импорта в psql). Я знаю, что другим способом было бы использовать метод pandas pandas .Dataframe.to_ sql (), но я не вижу, что введение pandas для этого кажется лучшим дизайном здесь. Обычно я использую ORM, но я не уверен, есть ли быстрый способ получить CSV таким способом. Допустим, у меня был CSV таблицы, Product
, с двумя столбцами, Name
и Cost
. Чтобы сделать это в ORM, я бы сделал следующее:
...
db = SQLAlchemy(app)
class Product(db.Model):
__tablename__ = 'product'
name = db.Column(db.String)
cost = db.Column(db.Double)
Однако я возвращаюсь к вопросу получения CSV в python для загрузки в таблицу. pandas from_csv (''). Я думаю, я мог бы также открыть сам файл и l oop через него. Что-то вроде
for record in csv_file:
product = Product(name=..., cost=...)
db.session.add(product)
db.session.commit()
Есть ли лучший способ? У ORM есть способ загрузить CSV, позволяя мне избегать необработанных SQL большую часть времени? Спасибо.