Замена параметра для PRAGMA в Python sqlite3 [дубликат]

Основываясь на превосходном решении [DMG], [6], здесь представлена ​​универсальная векторная (без петель) функция, которая разбивает столбец кадра данных на несколько строк и объединяет его с исходным фреймворком данных.

def change_column_order(df, col_name, index):
    cols = df.columns.tolist()
    cols.remove(col_name)
    cols.insert(index, col_name)
    return df[cols]

def split_df(dataframe, col_name, sep):
    orig_col_index = dataframe.columns.tolist().index(col_name)
    orig_index_name = dataframe.index.name
    orig_columns = dataframe.columns
    dataframe = dataframe.reset_index()  # we need a natural 0-based index for proper merge
    index_col_name = (set(dataframe.columns) - set(orig_columns)).pop()
    df_split = pd.DataFrame(
        pd.DataFrame(dataframe[col_name].str.split(sep).tolist())
        .stack().reset_index(level=1, drop=1), columns=[col_name])
    df = dataframe.drop(col_name, axis=1)
    df = pd.merge(df, df_split, left_index=True, right_index=True, how='inner')
    df = df.set_index(index_col_name)
    df.index.name = orig_index_name
    # merge adds the column to the last place, so we need to move it back
    return change_column_order(df, col_name, orig_col_index)

Пример:

df = pd.DataFrame([['a:b', 1, 4], ['c:d', 2, 5], ['e:f:g:h', 3, 6]], 
                  columns=['Name', 'A', 'B'], index=[10, 12, 13])
df
        Name    A   B
    10   a:b     1   4
    12   c:d     2   5
    13   e:f:g:h 3   6

split_df(df, 'Name', ':')
    Name    A   B
10   a       1   4
10   b       1   4
12   c       2   5
12   d       2   5
13   e       3   6
13   f       3   6    
13   g       3   6    
13   h       3   6    

Обратите внимание, что он сохраняет исходный индекс и порядок столбцов. Он также работает с dataframes, которые имеют непоследовательный индекс.

15
задан porgarmingduod 12 January 2012 в 22:01
поделиться

2 ответа

Вы просто не можете использовать заполнители для имен столбцов или таблиц. У меня нет авторитетной цитаты для этого - я «знаю» это только из-за того, что пробовал это и от неудачи. Это имеет смысл:

  • Если параметры столбцов и таблицы могут быть параметризованы, было бы мало смысла готовить (execute -ing) инструкцию SQL перед извлечением, поскольку все части оператор может быть заменен.
  • Я не уверен в pysqlite1, но MySQLdb автоматически цитирует все строковые параметры. Имена столбцов и таблиц не должны указываться. Таким образом, это усложнит синтаксический разбор, требуемый драйвером, если ему нужно будет решить, имеет ли местозаполнитель имя столбца или таблицы по сравнению со значением, которое требуется для цитирования.

Короче говоря, вы нашли Правильный путь - использовать строковое форматирование.

c.execute('SELECT {} FROM {} WHERE id=?'.format(column, table), row))

1 Не все параметры котировки драйверов - oursql нет, поскольку он отправляет SQL и аргументы на сервер отдельно.

17
ответ дан unutbu 27 August 2018 в 02:04
поделиться

Как ответил @unutbu, нет способа использовать заполнители для имен таблиц / столбцов. Мое предложение делать то, что вы делаете сейчас, но также указывать имена таблиц, чтобы защитить себя от таблицы или столбца, у которого может быть нечетное имя.

Что говорит SQL-стандарт об использовании backtick (`)? уже объясняет это в некоторой степени, и, несмотря на мнение в этом ответе, я бы сказал, что в вашем случае цитирование - хорошая идея.

2
ответ дан Community 27 August 2018 в 02:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: