sqlite выбор нескольких таблиц - PullRequest
0 голосов
/ 03 июня 2018

У меня есть база данных в sqlite с таблицами c.300.В настоящее время я перебираю список и добавляю данные.

Есть ли более быстрый / более питонский способ сделать это?

df = []
for i in Ave.columns:
    try:
        df2 = get_mcap(i)
        df.append(df2)
        #print (i)
    except:
        pass
df = pd.concat(df, axis=0

Ave - это фрейм данных, в котором столбец в списке, который я хочу перебрать.

def get_mcap(Ticker):
    cnx = sqlite3.connect('Market_Cap.db')
    df = pd.read_sql_query("SELECT * FROM '%s'"%(Ticker), cnx)
    df.columns = ['Date', 'Mcap-Ave', 'Mcap-High', 'Mcap-Low']
    df = df.set_index('Date')
    df.index = pd.to_datetime(df.index)
    cnx.close
    return df

1 Ответ

0 голосов
/ 03 июня 2018

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

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

В решение.Похоже, вы можете получить список таблиц, используя:

tables = Ave.columns.tolist()

Для моего простого примера я собираюсь использовать:

tables = ['table1', 'table2', 'table3']

Затем используйте следующий код для генерацииодин запрос:

query_template = 'select * from {}'
query_parts = []
for table in tables:
    query = query_template.format(table)
    query_parts.append(query)
full_query = ' union all '.join(query_parts)

Предоставление:

'select * from table1 union all select * from table2 union all select * from table3'

Затем вы можете просто выполнить этот один запрос, чтобы получить свои результаты:

cnx = sqlite3.connect('Market_Cap.db')
df = pd.read_sql_query(full_query, cnx)

Тогда отсюда вы должныбыть в состоянии установить индекс, преобразовать в datetime и т. д., но теперь вам нужно выполнять эти операции только один раз, а не 300 раз.Я полагаю, что общее время выполнения этого теперь должно быть намного быстрее.

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