Как правильно связать данные с запросом sqlite в Python / Pandas - PullRequest
0 голосов
/ 25 апреля 2018

Я пишу функцию в классе, которая позволяет пользователю передавать имя таблицы sqlite для чтения, имена столбцов, которые пользователь хочет прочитать в память, и дискриминаторы, которые можно использовать для фильтрации по ключевым словам в определенных столбцах. , Первая часть функции строит текстовую строку и помещает символы ? в область, куда данные должны быть переданы с помощью команды params. У меня есть команда печати в функции, чтобы помочь мне проверить правильность текстовой строки. Текстовая строка с правильными ключевыми словами работает при ручном вводе в командной строке sqlite3, но не работает при реализации в моей функции. Я предполагаю, что моя проблема в том, как я связываю данные с позициями ?, но я не уверен. Мой класс и тест класса выглядят следующим образом.

class ReadSQLite:
    def __init__(self, database):
        self.database = database
        try:
            self.conn = sqlite3.connect(self.database)
            self.cur = self.conn.cursor()
        except sqlite3.Error:
            sys.exit('{}{}{}'.format('FATAL ERROR: ', self.database, ' does not exist'))
# ---------------------------------------------------------------------------------------------            
        def close_database_connection(self):
            self.conn.close()
            return
# ---------------------------------------------------------------------------------------------
        def query_columns_by_keywords_to_dataframe(self, table, columns, column, keys):
            query = 'SELECT '
            for i in range(len(columns)):
                query = query + columns[i] + ', '
            query = query[:-2] + ' from ' + table + ' where '
            for i in range(len(column)):
                query = query + column[i] + " = (?)" + ' and '
            query = query[:-5]
            print(query)
            pd.read_sql_query(query, self.conn, params=((keys), ))
#=============================================================================================
#=============================================================================================
# MAIN PROGRAM
file_name = 'data/unittests/read_files/database_two.db'
test3 = ReadSQLite(file_name)
df = test3.query_columns_by_keywords_to_dataframe('test', 
                                                 ['category', 'food'],
                                                 ['category'],
                                                 ['fruit'])
test3.close_database_connection()

Я пытаюсь использовать код для чтения в тестовой базе данных с именем database_two.db, которая содержит таблицу с названием test. База данных содержит следующую информацию

id            category       food
------------  -------------- ----------
1             fruit          banana
2             meat           steak
3             vegetable      celery
4             meat           pork chop 
5             fruit          orange 
6             vegetable      tomato 

1 Ответ

0 голосов
/ 25 апреля 2018

В ожидании ответа я решил свой вопрос и решил опубликовать ответ.Я обнаружил, что сделал две небольшие ошибки.Во-первых, ? не должен был быть окружен парантезом, а во-вторых, связывание params также не должно было быть заключено в скобки.Правильная функция-член должна выглядеть следующим образом.

def query_columns_by_keywords_to_dataframe(self, table, columns, column, keys):
    query = 'SELECT '
    for i in range(len(columns)):
        query = query + columns[i] + ', '
    query = query[:-2] + ' from ' + table + ' where '
    for i in range(len(column)):
        query = query + column[i] + " = ?" + ' and '
    query = query[:-5]
    df = pd.read_sql_query(query, self.conn, params=keys)
    return df

В этом случае функция работает отлично.

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