Избегайте имени таблицы в sql алхимии - PullRequest
0 голосов
/ 27 марта 2020

Мне нужно экранировать имена таблиц для любого механизма sqlalchemy (я хочу расширить созданную мной библиотеку для других баз данных, кроме postgres, см. Раздел «Подробности» в конце моего сообщения) автоматически .

Это возможно с такими столбцами:

from sqlalchemy.sql import column
from sqlalchemy import create_engine

engine = create_engine("sqlite:///test.db")
escaped_column = column('%"my_column123?').compile(dialect=engine.dialect)
str(escaped_column)
'"%""my_column123?"'

Я (наивно) пробовал следующее, но это не работает (возвращает пустую строку):

from sqlalchemy.sql import table
from sqlalchemy import create_engine

engine = create_engine("sqlite:///test.db")
escaped_table_name = table("%table?&;").compile(dialect=engine.dialect)
str(escaped_table_name)
''

Заранее спасибо!

Подробности

Я создал библиотеку для обновления таблицы PostGres, используя pandas DataFrames (см. https://github.com/ThibTrip/pangres) и понял, что часть кода не SQL безопасна для инъекций (если вам интересно, вот часть, о которой я говорю: https://github.com/ThibTrip/pangres/blob/7cfa2d2190cf65a1ede8ef30868883f0da3fa5fc/pangres/helpers.py#L270 -L290 ).

1 Ответ

0 голосов
/ 27 марта 2020

Я нашел способ добавлять столбцы «sqlalchemy» (добавление столбцов в любую таблицу было причиной, по которой я хотел избежать имен таблиц). К сожалению, он не идеален, так как создает таблицу "alembic_version" по некоторым причинам:

# alembic is a library from the creator of sqlalchemy to migrate databases
from alembic.runtime.migration import MigrationContext # pip install alembic
from alembic.operations import Operations
from sqlalchemy import Column, TEXT, create_engine # pip install sqlalchemy

# create engine
engine = create_engine('sqlite:///test.db')

# add column "some_new_column" of type TEXT in the table 'test'
with engine.connect() as con:
    ctx = MigrationContext.configure(con, )
    op = Operations(ctx)
    op.add_column('test', column=Column('some_new_column', TEXT))

РЕДАКТИРОВАТЬ: кажется, что таблица "alembic_version" была каким-то образом добавлена ​​предыдущими тестами, поскольку я не мог воспроизвести это поведение после опуская стол. Так что это решение кажется хорошим :)

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