Учебное пособие по Python, PostgreSQL и Psycopg2
Чтобы разработать приложение, выходящее за рамки простого сценария, необходимо сохранить данные вне памяти в базе данных. Есть много возможных вариантов для базы данных, но PostgreSQL - это надежная платформа с открытым исходным кодом, которую можно легко масштабировать для производства.
Python и PostgreSQL могут быть объединены для быстрой разработки мощных приложений. Psycopg - это адаптер PostgreSQL, который можно использовать для использования PostgreSQL через библиотеку на основе Python. В этом руководстве будет рассмотрена установка Psycopg2 и некоторого кода Python, чтобы продемонстрировать его использование.
Вы можете установить Psycopg2 с помощью следующей команды терминала pip.
$ pip install psycopg2При установке вы должны увидеть вывод терминала ниже.
Сбор psycopg2Скачивание psycopg2-2.7.3.2-cp27-cp27m-
macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10
_10_x86_64.whl (1.7 МБ)
100% | ███████████████████████████████ | 1.7 МБ 397 КБ / с
Установка собранных пакетов: psycopg2
Успешно установлен psycopg2-2.7.3.2
Брэдли-Мини: ~ БрэдлиПэттон $
Чтобы импортировать пакет Psycopg2 в свое приложение Python, используйте следующую строку кода.
импорт psycopg2Чтобы получить данные для загрузки в нашу базу данных, я позаимствовал код из предыдущего руководства по pandas. Приведенный ниже код создаст pandas DataFrame с историческими данными. Затем это будет использовано для создания таблицы в таблице PostgreSQL.
def get_data (символы, начальная_дата, конечная_дата):панель = данные.DataReader (символы, "yahoo", начальная_дата, конечная_дата)
df = панель ["Закрыть"]
df.columns = map (str.нижний, df.столбцы)
hd = список (df)
печать df.глава()
печать HD
return df
Теперь я настрою служебный код, используемый для запуска учебника. Эти два метода будут использоваться для вызова созданных нами методов Psycopg2.
def tutorial_run ():символы = ['SPY', 'AAPL', 'GOOG']
df = get_data (символы, '2006-01-03', '2017-12-31')
если __name__ == "__main__":
tutorial_run ()
Чтобы подключиться к базе данных PostgreSQL, нам нужно будет добавить следующий метод. Try \ Except обеспечивает некоторую обработку ошибок в случае, если локальная база данных не запущена или в базу данных передаются неверные параметры подключения. Метод подключения в библиотеке Psycopg2 подключается к базе данных с параметрами, переданными в строке подключения. Ваши параметры для dbname, user и password могут отличаться. Если соединение по какой-либо причине не удается, в консоль будет записано сообщение об ошибке. Этот метод возвращает объект подключения обратно нашему методу вызова, где его можно использовать для дальнейших операций с базой данных.
def connect ():cons = "dbname = 'tutorial' user =" postgres "host =" localhost "password =" password ""
пытаться:
conn = psycopg2.подключить (минусы)
печать "Подключено"
Кроме:
печать "Я не могу подключиться к базе данных"
return conn
После того, как мы установили соединение с базой данных PostgreSQL, мы можем загрузить наши данные из метода get_data () в нашу базу данных. Psycopg2 и pandas делают этот процесс очень простым.
Первая строка определяет метод, который pandas должен использовать для подключения к базе данных, чтобы скопировать DataFrame. Вы предоставите те же параметры, что и ваш метод подключения. Вторая строка кода сохраняет DataFrame в базе данных PostgreSQL с помощью метода to_sql ().
def create_table (таблица, df):engine = create_engine ('postgresql + psycopg2: // postgres: [защита электронной почты]: 5432 / учебник')
df.to_sql (таблица, движок, if_exists = 'заменить')
Беглый взгляд на наш терминал pgAdmin PostgreSQL показывает, что код успешно загрузил DataFrame в таблицу «close». Теперь, когда у нас есть данные, загруженные в нашу базу данных. Мы можем использовать psycopg для выполнения некоторых запросов к данным. Приведенный ниже метод создан для того, чтобы взять соединение, установленное в нашем первом методе, и выполнить запрос в нашей базе данных PostgreSQL. Чтобы создать 4 объекта SQL, нам нужно добавить еще один оператор импорта.
из psycopg2 импортировать sqlЧтобы создать динамические команды SQL, psycopg использует форматирование строки для заполнения переменных в строке с помощью операторов% s и .
PostrgreSQL чувствителен к регистру. В методе get_data () мы заставили заголовки наших столбцов использовать строчные буквы. Индекс не был включен в эту инструкцию. Чтобы передать заголовок столбца «Данные» в запросе, нам нужно передать его в PostgreSQL в двойных кавычках. Чтобы сделать это в строке в Python, вам необходимо отправить escape-символ «\» перед двойными кавычками.
Мы можем заменить «% s» в строке, используя синтаксис форматирования строки Python, указанный ниже. Это заменяет% s нашим параметром даты dt.
Чтобы выполнить созданный SQL-запрос. Затем вам нужно передать его в курсор .execute () метод. Позвонив в .fetchall (), вы возвращаете результаты запроса. При печати на консоли вы можете отображать результаты.
def get_row (dt, conn):cr = conn.курсор()
query = sql.SQL ("ВЫБРАТЬ aapl из закрытия WHERE" Date "= '% s'"% dt)
cr.выполнить (запрос)
печать cr.fetchall ()
Чтобы запустить эту функцию, мы добавляем следующую строку кода в метод tutorial_run (). Вы должны получить результаты, аналогичные приведенным ниже.
get_row ("2017-12-29", conn)
В следующем методе мы будем использовать методы строкового формата для передачи нескольких параметров в наш запрос. Этот запрос займет дату и три столбца. Помимо использования оператора% s, мы будем использовать оператор для объединения строковых переменных в строку и вставки их в нашу строку запроса. Наша строка запроса теперь использует соединение ниже с разделителем «,» для передачи нескольких имен столбцов в наш запрос.
def get_cols (dt, col1, col2, col3, conn):cr = conn.курсор()
query = sql.SQL ("SELECT from close WHERE" Date "= '% s'"% dt).формат(
sql.SQL (',').присоединиться ([sql.Идентификатор (col1), sql.Идентификатор (col2), sql.Идентификатор (col3)]))
cr.выполнить (запрос)
печать cr.fetchall ()
Чтобы использовать наш новый метод, я добавлю следующую строку в наш метод tutorial_run (). Вы должны увидеть результаты ниже.
get_cols ("2017-12-29", "aapl", "spy", "goog", conn)
Следующий метод, который мы напишем, будет использовать две замены строк для извлечения всех данных в нашей таблице, за исключением нашего индекса. Этот метод основан на нашем предыдущем методе, добавляя вторую нотацию заменяющих скобок «1». На этот раз скобки пронумерованы так, что они заменены в коде понятия формата заказа. Наш новый метод объединяет три параметра столбца через запятую. Кроме того, вторым параметром в методе форматирования является табличная переменная. Затем создается строка запроса путем замены скобок параметрами в методе форматирования в следующем порядке:. Это 0 = столбцы и 1 = имя таблицы.
def get_tab (таблица, col1, col2, col3, conn):cr = conn.курсор()
query = sql.SQL ("ВЫБРАТЬ 0 из 1").формат(
sql.SQL (',').присоединиться ([sql.Идентификатор (col1), sql.Идентификатор (col2),
sql.Идентификатор (col3)]), sql.Идентификатор (таблица))
cr.выполнить (запрос)
печать cr.fetchall ()
Чтобы использовать наш новый метод, я добавлю следующую строку в наш метод tutorial_run (). Вы должны увидеть результаты ниже.
get_tab ("закрыть", "aapl", "шпион", "goog", conn)
В библиотеке psycopg есть еще много методов. Это должно дать вам хорошее представление о функциях psycopg. Я предоставил еще несколько ресурсов ниже на страницах документации, которые позволят вам более подробно изучить библиотеку.
Полный код
импорт psycopg2из psycopg2 импортировать sql
импортировать pandas_datareader как данные
def get_data (символы, начальная_дата, конечная_дата):
панель = данные.DataReader (символы, "yahoo", начальная_дата, конечная_дата)
df = панель ["Закрыть"]
df.columns = map (str.нижний, df.столбцы)
hd = список (df)
печать df.глава()
печать HD
return df
def connect ():
cons = "dbname = 'tutorial' user =" postgres "host =" localhost "password =" password ""
пытаться:
conn = psycopg2.подключить (минусы)
печать "Подключено"
Кроме:
печать "Я не могу подключиться к базе данных"
return conn
def create_table (таблица, df):
engine = create_engine ('postgresql + psycopg2: // postgres: [защита электронной почты]: 5432 / учебник')
df.to_sql (таблица, движок, if_exists = "заменить")
def get_row (dt, conn):
cr = conn.курсор()
query = sql.SQL ("ВЫБРАТЬ aapl из закрытия WHERE" Date "= '% s'"% dt)
cr.выполнить (запрос)
печать cr.fetchall ()
def get_cols (dt, col1, col2, col3, conn):
cr = conn.курсор()
query = sql.SQL ("SELECT from close WHERE" Date "= '% s'"% dt).формат(
sql.SQL (',').присоединиться ([sql.Идентификатор (col1),
sql.Идентификатор (col2), sql.Идентификатор (col3)]))
cr.выполнить (запрос)
печать cr.fetchall ()
def get_tab (таблица, col1, col2, col3, conn):
cr = conn.курсор()
query = sql.SQL ("ВЫБРАТЬ 0 из 1").формат(
sql.SQL (',').присоединиться ([sql.Идентификатор (col1), sql.Идентификатор (col2),
sql.Идентификатор (col3)]), sql.Идентификатор (таблица))
cr.выполнить (запрос)
печать cr.fetchall ()
def tutorial_run ():
conn = connect ()
символы = ['SPY', 'AAPL', 'GOOG']
df = get_data (символы, '2006-01-03', '2017-12-31')
create_table ("закрыть", df)
get_row ("2017-12-29", conn)
get_cols ("2017-12-29", "aapl", "spy", "goog", conn)
get_tab ("закрыть", "aapl", "spy", "goog", conn)
если __name__ == "__main__":
tutorial_run ()
Рекомендации
initd.org / psycopg
initd.org / psycopg / docs / install.html
http: // initd.org / psycopg / docs / sql.html
вики.postgresql.org / wiki / Psycopg2_Tutorial