Примеры работы с MySQL в Python при помощи модуля PyMySQL
В следующей инструкции будет показано, как использовать MySQL в Python при помощи PyMySQL модуля.
PyMySQL на примерах
PyMySQL представляет собой уникальную для Python клиентскую библиотеку, основанную на PEP 249. Большая часть общедоступных API совместимы с mysqlclient и MySQLdb. PyMySQL работает с MySQL 5.5+ и MariaDB 5.5+.
MySQL считается лидирующей системой управления базами данных с открытым исходным кодом. Это многопользовательская и многопоточная система управления базами данных. MySQL пользуется особой популярностью у программистов.
Установка PyMySQL
$ sudo pip3 install PyMySQL
$ sudo pip3 install PyMySQL |
Для установки PyMySQL используется pip3.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Python Форум Помощи
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Подписаться
PyMySQL — узнаем версию MySQL
В следующем примере показано, как отобразить текущую версию MySQL.
Python
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql con = pymysql.connect(‘localhost’, ‘user17’, ‘s$cret’, ‘mydb’) with con: cur = con.cursor() cur.execute(«SELECT VERSION()») version = cur.fetchone() print(«Database version: {}».format(version[0]))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/python3 # -*- coding: utf-8 -*-
import pymysql
con = pymysql.connect(‘localhost’, ‘user17’, ‘s$cret’, ‘mydb’)
with con:
cur = con.cursor() cur.execute(«SELECT VERSION()»)
version = cur. fetchone() print(«Database version: {}».format(version[0])) |
Для того чтобы узнать версию MySQL, можно использовать команду SELECT VERSION()
.
Python
import pymysql
import pymysql |
Для этого потребуется импортировать pymysql
модуль.
Python
con = pymysql.connect(‘localhost’, ‘user17’, ‘s$cret’, ‘mydb’)
con = pymysql.connect(‘localhost’, ‘user17’, ‘s$cret’, ‘mydb’) |
Затем производится подключение к базе данных при помощи
. Здесь требуется указать четыре параметра:
- имя хоста;
- имя пользователя;
- пароль;
- название базы данных.
Python
with con:
with con: |
При помощи with
интерпретатор Python автоматически открывает доступные ресурсы. Он также обрабатывает возможные ошибки.
Python
cur = con.cursor()
cur = con.cursor() |
Из объекта подключения con
создается курсор. Курсор используется для перемещения записей из набора результатов.
Python
cur.execute(«SELECT VERSION()»)
cur.execute(«SELECT VERSION()») |
Для использования команды SQL вызывается метод курсора execute()
.
Python
version = cur.fetchone()
version = cur.fetchone() |
Метод fetchone()
позволяет вызвать следующую строку из набора результатов запроса, показывая только одну запись. В том случае, если доступных данных нет, выводится
.
Python
print(«Database version: {}». format(version[0]))
print(«Database version: {}».format(version[0])) |
Таким образом, версия базы данных выводится на экран.
$ ./version.py Database version: 5.7.23-0ubuntu0.16.04.1
$ ./version.py Database version: 5.7.23-0ubuntu0.16.04.1 |
Это результат вывода.
PyMySQL fetchAll
Метод fetchAll()
позволяет извлечь все (оставшиеся) строки результата запроса, возвращая их в виде последовательности последовательностей.
Python
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql con = pymysql.connect(‘localhost’, ‘user17’, ‘s$cret’, ‘testdb’) with con: cur = con.cursor() cur.execute(«SELECT * FROM cities») rows = cur.fetchall() for row in rows: print(«{0} {1} {2}».format(row[0], row[1], row[2]))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #!/usr/bin/python3 # -*- coding: utf-8 -*-
import pymysql
con = pymysql. connect(‘localhost’, ‘user17’, ‘s$cret’, ‘testdb’)
with con:
cur = con.cursor() cur.execute(«SELECT * FROM cities»)
rows = cur.fetchall()
for row in rows: print(«{0} {1} {2}».format(row[0], row[1], row[2])) |
В данном примере из таблицы базы данных выводятся все города (cities).
Python
cur.execute(«SELECT * FROM cities»)
cur.execute(«SELECT * FROM cities») |
Данный оператор SQL выбирает все данные из таблицы cities
.
Python
rows = cur.fetchall()
rows = cur.fetchall() |
Метод fetchall()
позволяет получить все записи. Он возвращает набор результатов. Технически, это кортеж из кортежей.
Python
for row in rows: print(«{0} {1} {2}».format(row[0], row[1], row[2]))
for row in rows: print(«{0} {1} {2}».format(row[0], row[1], row[2])) |
Данные выводятся в консоль строка за строкой.
$ ./retrieve_all.py 1 Bratislava 432000 2 Budapest 1759000 3 Prague 1280000 4 Warsaw 1748000 5 Los Angeles 3971000 6 New York 8550000 7 Edinburgh 464000 8 Berlin 3671000
1 2 3 4 5 6 7 8 9 | $ ./retrieve_all.py 1 Bratislava 432000 2 Budapest 1759000 3 Prague 1280000 4 Warsaw 1748000 5 Los Angeles 3971000 6 New York 8550000 7 Edinburgh 464000 8 Berlin 3671000 |
Это результат вывода.
PyMySQL словарь курсора
По умолчанию курсор возвращает данные в кортеж из кортежей. При использовании словаря курсора данные отправляются в форму, которая используется словарями Python. В таком случае появляется возможность обращения к данным посредством названий их столбцов.
Python
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql import pymysql.cursors con = pymysql.connect(host=’localhost’, user=’user17′, password=’s$cret’, db=’mydb’, charset=’utf8mb4′, cursorclass=pymysql.cursors.DictCursor) with con: cur = con.cursor() cur.execute(«SELECT * FROM cities») rows = cur.fetchall() for row in rows: print(row[«id»], row[«name»])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/usr/bin/python3 # -*- coding: utf-8 -*-
import pymysql import pymysql. cursors
con = pymysql.connect(host=’localhost’, user=’user17′, password=’s$cret’, db=’mydb’, charset=’utf8mb4′, cursorclass=pymysql.cursors.DictCursor)
with con:
cur = con.cursor() cur.execute(«SELECT * FROM cities»)
rows = cur.fetchall() for row in rows: print(row[«id»], row[«name»]) |
В данном примере показано, как получить первые строки таблицы cities
при помощи использования словаря курсора.
Python
con = pymysql.connect(host=’localhost’, user=’user17′, password=’s$cret’, db=’mydb’, charset=’utf8mb4′, cursorclass=pymysql.cursors.DictCursor)
1 2 3 4 5 6 | con = pymysql.connect(host=’localhost’, user=’user17′, password=’s$cret’, db=’mydb’, charset=’utf8mb4′, cursorclass=pymysql. cursors.DictCursor) |
Используя метод connect()
, можно передать значение pymysql.cursors.DictCursor
параметру cursorclass
.
Python
for row in rows: print(row[«id»], row[«name»])
for row in rows: print(row[«id»], row[«name»]) |
Обращение к данным происходит при помощи названий столбцов таблицы cities
.
PyMySQL заголовки столбцов
Далее будет показано, как вывести названия столбцов с информацией из таблицы базы данных.
Python
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql con = pymysql.connect(‘localhost’, ‘user17’, ‘s$cret’, ‘testdb’) with con: cur = con.cursor() cur.execute(«SELECT * FROM cities») rows = cur.fetchall() desc = cur.description print(«{0:>3} {1:>10}».format(desc[0][0], desc[1][0])) for row in rows: print(«{0:3} {1:>10}». format(row[0], row[2]))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #!/usr/bin/python3 # -*- coding: utf-8 -*-
import pymysql
con = pymysql.connect(‘localhost’, ‘user17’, ‘s$cret’, ‘testdb’)
with con:
cur = con.cursor() cur.execute(«SELECT * FROM cities»)
rows = cur.fetchall()
desc = cur.description
print(«{0:>3} {1:>10}».format(desc[0][0], desc[1][0]))
for row in rows: print(«{0:3} {1:>10}».format(row[0], row[2])) |
Названия столбцов представляют собой метаданные. Они извлекаются из объекта курсора.
Python
desc = cur.description
desc = cur. description |
Атрибут курсора description
возвращает информацию о каждом результативном столбце запроса.
Python
print(«{0:>3} {1:>10}».format(desc[0][0], desc[1][0]))
print(«{0:>3} {1:>10}».format(desc[0][0], desc[1][0])) |
Таким образом, выводятся и форматируются названия столбцов таблицы.
Python
for row in rows: print(«{0:3} {1:>10}».format(row[0], row[2]))
for row in rows: print(«{0:3} {1:>10}».format(row[0], row[2])) |
Данные перебираются и выводятся на экран при помощи цикла for.
$ ./column_headers.py id name 1 432000 2 1759000 3 1280000 4 1748000 5 3971000 6 8550000 7 464000 8 3671000
1 2 3 4 5 6 7 8 9 10 | $ . /column_headers.py id name 1 432000 2 1759000 3 1280000 4 1748000 5 3971000 6 8550000 7 464000 8 3671000 |
Это результат вывода.
PyMySQL связываемые переменные
При написании связываемых переменных вместо прямого введения значений используется специальные плейсхолдеры (placeholders). Связываемые переменные позволяют повысить безопасность и производительность.
Python
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql con = pymysql.connect(‘localhost’, ‘user17’, ‘s$cret’, ‘testdb’) # user input myid = 4 with con: cur = con.cursor() cur.execute(«SELECT * FROM cities WHERE id=%s», myid) cid, name, population = cur.fetchone() print(cid, name, population)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/usr/bin/python3 # -*- coding: utf-8 -*-
import pymysql
con = pymysql. connect(‘localhost’, ‘user17’, ‘s$cret’, ‘testdb’)
# user input myid = 4
with con:
cur = con.cursor()
cur.execute(«SELECT * FROM cities WHERE id=%s», myid)
cid, name, population = cur.fetchone() print(cid, name, population) |
В данном примере показано, как получить строку с определенным Id.
Python
cur.execute(«SELECT * FROM cities WHERE id=%s», myid)
cur.execute(«SELECT * FROM cities WHERE id=%s», myid) |
Здесь используется плейсхолдер, который идентифицируется при помощи маркера %s. Перед тем, как определенная SQL переменная будет задействована, она должна быть привязана к ее плейсхолдеру.
$ ./prepared_statement.py 4 Warsaw 1748000
$ ./prepared_statement.py 4 Warsaw 1748000 |
Это результат вывода.
PyMySQL задействованные строки
Предназначенный только для чтения атрибут курсор rowcount
показывает количество строк, которые были получены в результате последнего использования одного из операторов SELECT, UPDATE или INSERT.
Python
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql con = pymysql.connect(‘localhost’, ‘user17’, ‘s$cret’, ‘mydb’) with con: cur = con.cursor() cur.execute(«SELECT * FROM cities WHERE id IN (1, 2, 3)») # rows = cur.fetchall() # for row in rows: # print(«{0} {1} {2}».format(row[0], row[1], row[2])) print(«The query affected {} rows».format(cur.rowcount))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/usr/bin/python3 # -*- coding: utf-8 -*-
import pymysql
con = pymysql. connect(‘localhost’, ‘user17’, ‘s$cret’, ‘mydb’)
with con:
cur = con.cursor() cur.execute(«SELECT * FROM cities WHERE id IN (1, 2, 3)»)
# rows = cur.fetchall()
# for row in rows: # print(«{0} {1} {2}».format(row[0], row[1], row[2]))
print(«The query affected {} rows».format(cur.rowcount)) |
В данном примере, показано, что используемый оператор SELECT
выбирает три строки.
Python
print(«The query affected {} rows».format(cur.rowcount))
print(«The query affected {} rows».format(cur.rowcount)) |
Таким образом, составляется сообщение, в котором показывается количество задействованных строк.
$ ./affected_rows.py The query affected 3 rows
$ ./affected_rows.py The query affected 3 rows |
Это результат вывода.
В данной инструкции было показано, как использовать базу данных MySQL в Python при помощи модуля PyMySQL.
Vasile Buldumac
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: [email protected]
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»
fetchone() работает с таблицей1, но не с таблицей2, но fetchall() работает с обоими [python, sqlite]
Я не уверен, как устранить эту проблему: у меня есть три таблицы в моей базе данных SQLite3, и строки данных таблицы 1 не отображаются, когда я пытаюсь получить к ним доступ в цикле for с помощью fetchone()
, но строки данных моего таблица 3 отлично отображается с использованием цикла for и fetchone()
. fetchall()
— единственный метод, который работает для доступа к данным в таблице 1, а fetchall()
также работает с таблицей 3. У меня есть одна строка данных только в таблице 1 и 3 текстовых столбцах и много строк данных только в таблице 3 и 6 текстовых столбцах. Этот показанный пример интерактивного режима демонстрирует ту же проблему, что и мой неинтерактивный сценарий:
>>> cur.execute('select * from ' + tablename1) <sqlite3.Cursor object at 0x021A3420> >>> print '\n'+str(cur.fetchall()) [(u'OMAHA / COUNCIL BLUFFS, NEBRASKA, US', None, u'green')] >>> cur.execute('select * from ' + tablename1) <sqlite3.Cursor object at 0x021A3420> >>> for row in cur: ... data = cur.fetchone() ... print data ... None >>> cur.execute('select * from '+tablename1) <sqlite3.Cursor object at 0x021A3420> >>> cur.execute('PRAGMA table_info('+tablename1+')') <sqlite3.Cursor object at 0x021A3420> >>> data = cur. fetchall() >>> for d in data: ... print d[0], d[1], d[2] ... 0 REGIONUPPERCASE TEXT 1 REGION TEXT 2 REDGREEN TEXT >>> cur.execute('select * from '+tablename3) <sqlite3.Cursor object at 0x021A3420> >>> cur.execute('PRAGMA table_info('+tablename3+')') <sqlite3.Cursor object at 0x021A3420> >>> data = cur.fetchall() >>> for d in data: ... print d[0], d[1], d[2] ... 0 REGIONUPPERCASE TEXT 1 REGION TEXT 2 REDGREEN TEXT 3 COORDSLAT TEXT 4 COORDSLONG TEXT 5 CLHREF TEXT >>> cur.execute('select * from ' + tablename3) <sqlite3.Cursor object at 0x021A3420> >>> for row in cur: ... data = cur.fetchone() ... print data ... (u'BIRMINGHAM, ALABAMA, US', u'birmingham, Alabama, US', u'red', u'33.5206608', u'-86.80249', u' (u'FLORENCE / MUSCLE SHOALS, ALABAMA, US', u'florence / muscle shoals, Alabama, US', u'red', u'3 (u'HUNTSVILLE / DECATUR, ALABAMA, US', u'huntsville / decatur, Alabama, US', u'red', u'34.72849' (u'MONTGOMERY, ALABAMA, US', u'montgomery, Alabama, US', u'red', u'32. 3668052', u'-86.2999689', (u'ANCHORAGE / MAT-SU, ALASKA, US', u'anchorage / mat-su, Alaska, US', u'red', u'61.340307', u'- (u'KENAI PENINSULA, ALASKA, US', u'kenai peninsula, Alaska, US', u'red', u'59.8785222', u'-150.3 (u'FLAGSTAFF / SEDONA, ARIZONA, US', u'flagstaff / sedona, Arizona, US', u'red', u'34.8262376',
Как я уже сказал, fetchall()
работает для таблицы 3, я просто не публиковал этот вывод здесь. Я еще не добрался до таблицы 2 (это недавно созданная база данных, которую я еще не полностью функционализировал), поэтому давайте не будем беспокоиться о таблице 2 прямо сейчас. Это будет больше похоже на таблицу1, чем на таблицу3. Другими словами, схемы столбцов table1 и 2 являются подмножествами схемы столбцов table3.
Интересно, повреждена ли таблица или данные в ней? Это возможно. Просто мне это кажется таким странным. Я не знаю, как устранить эту проблему или с чего начать, поэтому прошу помощи у всех, кто может.
Спасибо всем за помощь другим!
python sqlite
person kenneth558 schedule 27. 02.2014 source источник
Ответы (1)
arrow_upward
2
arrow_downward
Вы перемещаетесь по курсору. Это дает данные уже. К тому времени, как вы позвоните fetchone()
, ряд уже будет обслужен.
Просто используйте переменную цикла, она содержит результат каждой строки при повторении:
cur.execute('select * from ' + tablename1) for row in cur: print row
Ваш цикл по tablename3
видит только половину строк; вы выбираете одну строку путем итерации, игнорируете эту строку, выбираете следующую с помощью cur.fetchone()
и печатаете ее, повторяя процесс в цикле.
Используйте итерацию или fetchone()
и fetchall()
. Не смешивайте два.
fetchone()
будет использоваться для получения только одной строки результата, например:
cur. execute('select * from ' + tablename1 + ' WHERE unique_column=?', ('somevalue',)) row = cur.fetchone() if row is not None: # there was a matching row, rejoice print row
person Martijn Pieters schedule 27.02.2014
Модуль sqlite3 языка Python
Сами по себе СУБД редко используются для работы с базами данных. В том смысле, что в реальных проектах связки БД + СУБД бывает недостаточно. Обычно с СУБД работают через какой-либо язык программирования. Это позволяет более гибко принимать запросы, обрабатывать ответы перед передачей их куда-либо далее. Ведь у императивного, а не декларативного как SQL, языка программирования средств для работы с данными больше, да и логика богаче.
При этом неизбежна определенная специфика, накладываемая языком программирования и особенностями его работы с СУБД. Есть команды на подключение к БД, использование объекта «курсора», выполнение SQL-запросов, сохранение изменений в БД и др.
Инструменты для работы с конкретной СУБД не являются базовыми командами и объектами самого языка. Обычно они подключаются через импорт модуля или библиотеки. Так модуль sqlite3 входит в установочный пакет языка Python, является компонентом стандартной библиотеки и не требует отдельной загрузки и установки. Однако его все равно надо импортировать:
>>> import sqlite3
Библиотеку SQLite также не требуется устанавливать отдельно. Она есть в установочном пакете Python. Непосредственно модуль sqlite3 – это API к СУБД SQLite. Своего рода адаптер, который переводит команды, написанные на Питоне, в команды, которые понимает SQLite. Как и наоборот, доставляет ответы от SQLite в python-программу.
Модуль sqlite3 содержит много классов, функций и констант. Их перечень можно посмотреть с помощью функции dir().
Вызов функции connect() приводит к созданию объекта-экземпляра от класса Connection. Этот объект обеспечивает связь с файлом базы данных, представляет конкретную БД в программе:
>>> db = sqlite3. connect('site.sqlite') >>> type(db) <class 'sqlite3.Connection'>
Почему объект создается с помощью функции, а не от самого класса? Видимо дело в том, что помимо имени-адреса базы данных может передаваться ряд других необязательных аргументов, первичной обработкой которых занимается функция.
После того как экземпляр Connection создан, чтобы выполнять SQL-команды, над создать еще один объект, но теперь уже от класса Cursor. Делается это с помощью метода cursor() объекта типа Connection:
SQL-команды выполняются с помощью метода execute() и некоторых других. Если запрос длинный, и его удобно разбить на несколько строк, используют тройные кавычки. Создадим таблицы:
>>> cur.execute(''' ... CREATE TABLE sections ( ... _id INTEGER PRIMARY KEY, ... name TEXT)''') <sqlite3.Cursor object at 0x7fd0f16fe110> >>> cur.execute(''' ... CREATE TABLE pages ( ... _id INTEGER PRIMARY KEY AUTOINCREMENT, ... title TEXT, ... url TEXT NOT NULL, . .. theme INTEGER NOT NULL, ... num INTEGER NOT NULL DEFAULT 100, ... FOREIGN KEY (theme) ... REFERENCES sections(_id)) ... ''') <sqlite3.Cursor object at 0x7fd0f16fe110>
Если нужна поддержка внешнего ключа включим ее:
>>> cur.execute("PRAGMA foreign_keys = ON") <sqlite3.Cursor object at 0x7fd0f16fe110>
Обратим внимание, что в конце SQL-запросов здесь точка с запитой не ставятся. Также метод возвращает сам объект.
Заполнять таблицы можно тоже с помощью execute(). Однако, если требуется вставить несколько записей, лучше воспользоваться методом executemany():
>>> themes = [ ... (1, 'Information'), ... (2, 'Digital Systems'), ... (3, 'Boolean Algebra')] >>> cur.executemany(''' ... INSERT INTO sections ... VALUES (?, ?)''', themes) <sqlite3.Cursor object at 0x7fe7729f8a40>
Мы создаем список из кортежей. Каждый кортеж – это отдельная запись таблицы. Метод executemany() выполняет SQL-команду по отношению к каждому элементу списка. При этом данные из кортежа подставляются вместо знаков вопроса. Такая подстановка работает и через execute():
>>> cur.execute(''' ... INSERT INTO sections VALUES ... (4, ?)''', ('Algorithm',)) <sqlite3.Cursor object at 0x7fe7729f8a40>
То, что подставляется, должно быть кортежем. Через знаки вопроса кортеж как бы распаковывается.
Есть еще метод executescript(). В качестве аргумента передается скрипт на языке SQL, который может включать несколько запросов, каждый из которых заканчивается точкой с запятой.
У объекта-курсора есть методы fetchone(), fetchmany() и fetchall(), которые позволяют извлекать из него данные, если sql-запрос предполагал их передачу. По-сути они наделяют курсор свойствами объекта-итератора (такой имеет метод __next__()):
>>> cur.execute("SELECT * FROM sections") <sqlite3.Cursor object at 0x7fd0f16fe110> >>> cur.fetchone() (1, 'Information') >>> cur.fetchone() (2, 'Digital Systems') >>> cur. __next__() (3, 'Boolean Algebra')
Два других метода:
>>> cur.execute("SELECT * FROM sections") >>> cur.fetchall() [(1, 'Information'), (2, 'Digital Systems'), (3, 'Boolean Algebra'), (4, 'Algorithm')] >>> cur.fetchall() [] >>> cur.execute("SELECT * FROM sections") <sqlite3.Cursor object at 0x7fd0f16fe110> >>> cur.fetchmany(2) [(1, 'Information'), (2, 'Digital Systems')] >>> cur.fetchmany(2) [(3, 'Boolean Algebra'), (4, 'Algorithm')] >>> cur.fetchmany(2) []
Для того, чтобы корректно завершить работу с базой данных, надо применить изменения (выполнить транзакцию) и разорвать соединение. Обратите внимание, это делается по отношению к экземпляру Connection, а не Cursor:
>>> db.commit() >>> db.close()
Закрытие без commit() приведет к потере изменений, сделанных за сессию. Если нужно откатить, а не применить, изменения текущей сессии, используется метод rollback().
Python базовая операция для sqlserver
Основные шаги:
- Импорт библиотеки pymssql
- Установить соединение
Общие параметры:
хост: хост
пользователь: имя пользователя
пароль: пароль
база данных: база данных
charset: charset, «utf8»
as_dict: запрашивает, возвращаются ли элементы в списке в виде словаря (по умолчанию False, элементы в списке являются кортежами)
autocommit: автоматическая фиксация транзакций (по умолчанию False, commit () требуется для фиксации транзакций) - Откройте курсор курсора через conn (верните None, чтобы открыть ошибку), выполните инструкцию sql
- Используйте, чтобы получить результат запроса, cursor.fetchall (), чтобы получить все незаписанные записи, cursor.fetchone (), чтобы получить первую запись, cursor.fetchmany (i), чтобы получить первую запись i
- После операций вставки, обновления и удаления conn.commit () должен отправить транзакцию и сохранить операцию.
- В конце операции conn. close () закрывает соединение с базой данных.
>>> import pymssql # Установить соединение >>> conn=pymssql.connect(host='HOST',user='USER',password='PASSWORD',database='test',charset='utf8') # Открыть курсор >>> cur=conn.cursor() # Выполнить SQL-запрос >>> cur.execute('select * from test1') # Положение курсора начинает получать первую запись >>> rs=cur.fetchone() >>> print(rs) (1, 'A ') # Положение курсора начинает получать несколько записей >>> rs=cur.fetchmany(2) >>> print(rs) [(2, 'B '), (3, 'C ')] # Получить все оставшиеся неприобретенные записи, записи, которые были получены ранее, не могут быть получены снова >>> rs=cur.fetchall() # Запись запроса по умолчанию - тип списка, а элемент - тип кортежа. >>> print(rs) [(4, 'D '), (5, 'E '), (6, 'F '), (7, 'G '), (8, 'H '), (9, 'I '), (10, 'J ')] # Только fetchall () может получить количество строк после извлечения записи, число строк не выбрано или число строк fetchone () и fetchmany () равно -1 # rowcount - это не только количество строк, полученных fetchall (), но и количество строк, полученных fetchone () и fetchmany (), то есть количество всех строк во всем результате запроса. >>> cur.rowcount 10 # Добавить параметр as_dict = True при установлении соединения, элементы в списке записей запроса имеют тип dict >>> conn=pymssql.connect(host='HOST',user='USER',password='PASSWORD',database='test',charset='utf8',as_dict=True) >>> print(rs) [{'id': 1, 'value': 'A '}, {'id': 2, 'value': 'B '}, {'id': 3, 'value': 'C '}, {'id': 4, 'value': 'D '}, {'id': 5, 'value': 'E '}, {'id': 6, 'value': 'F '}, {'id': 7, 'value': 'G '}, {'id': 8, 'value': 'H '}, {'id': 9, 'value': 'I '}, {'id': 10, 'value': 'J '}] # вставить, обновить, удалить операцию >>> cur.execute("insert into test1 (value) values ('k')") # lastrowid, получить номер идентификатора вставленной записи, для идентификатора необходимо установить идентификатор автоинкремента в базе данных >>> int(cur.lastrowid) 11 # Вернуть количество затронутых строк >>> cur.rowcount 1 # Откат транзакции, отмена незафиксированных изменений >>> conn. rollback() # После выполнения операций вставки, обновления и удаления, commit () требуется для отправки транзакции, иначе изменение будет недействительным после закрытия соединения. >>> conn.commit() # Запросите параметризацию оператора, поместите необходимые параметры в кортежи по порядку, а затем подставьте кортеж в качестве параметра для выполнения. Обратите внимание, что кортеж одного элемента должен быть запятым! >>> cur.execute('select * from test1 where value=%s',('D',)) >>> rs=cur.fetchall() >>> print(rs) [(4, 'D ')] # Нет параметров хранимой процедуры >>> cursor.callproc('SP_XXXXX') # Есть параметры хранимых процедур >>> cursor.callproc('SP_XXXXX',('ABC',)) # Существует хранимая процедура вывода, но она не удалась, возвращаемое значение msg должно быть набором параметров, подставляемых в хранимую процедуру >>> msg=cursor.callproc('SP_XXXXX',('ABC',pymssql.output(str))) >>> output=msg[1] # Хранимая процедура с возвращаемым значением также не удалась, самый распространенный метод в Интернете - работа с операторами SQL. # SP_test1 Описание: входной параметр @arg, запросить все записи test1, output возвращает количество строк, returnvalue возвращает 999 # Этот sql возвращает всего 3 набора записей, первый - результат запроса, второй - результат, а третий - значение возврата >>> sql="DECLARE @return_value int,@rows int;EXEC @return_value = [dbo].[SP_test1] @arg = N'b',@rows = @rows OUTPUT;SELECT @rows as N'@rows';SELECT 'Return Value' = @return_value" >>> rs=cur.fetchall() >>> rs [(1, 'A '), (2, 'B '), (3, 'C '), (4, 'D '), (5, 'E '), (6, 'F '), (7, 'G '), (8, 'H '), (9, 'I '), (10, 'J '), (11, 'k ')] # Указать следующий набор записей >>> cur.nextset() >>> rs=cur.fetchall() >>> rs [(11,)] # Указать следующий набор записей >>> cur.nextset() >>> rs=cur.fetchall() >>> rs [(999,)] >>> cur.close() >>> conn.close()
Используйте оператор with, чтобы упростить операцию без операции close ():
>>> with pymssql. connect(host='HOST',user='USER',password='PASSWORD',database='test',charset='utf8') as conn: with conn.cursor() as cur: cur.execute('select * from test1') rs=cur.fetchall() for row in rs: print(row[0],row[1]) 1 A 2 B 3 C 4 D 5 E 6 F 7 G 8 H 9 I 10 J 11 k
Как получить данные из SQLite таблицы на python, select from в модуле sqlite3
Главная Библиотеки Получение данных из таблицы SQLite
В этом материале речь пойдет о команде SELECT для получения данных из таблицы SQLite в приложении Python. Вы узнаете, как доставать строки с данными благодаря встроенному модулю sqlite3.
В этой статье мы будем:
- Получать все строки с помощью с помощью
cursor.fetchall()
. - Использовать
cursor.fetchmany(size)
для получения ограниченного количества строк, а такжеcursor.fetchone()
— для одной. - Использовать переменные Python в запросе SQLite для передачи динамических данных.
Подготовка
Перед работой с этой Python-программой нужно убедиться, что вы знаете название и подробности о колонках той SQLite-таблицы, с которой предстоит работать.
В этом примере будет использоваться таблица sqlitedb_developers
. Она была создана в первой части руководства по sqlite3 и заполнена во второй.
Шаги для получения строк из таблицы SQLite
Для выполнения операции SELECT из Python нужно выполнить следующие шаги:
- Установить соединение с базой данных SQLite из Python;
- Создать запрос с инструкцией SELECT для SQLite. Именно на этом этапе понадобятся знания названия таблицы и подробностей о колонках;
- Выполнить SELECT-запрос с помощью метода
cursor.execute()
- Получить строки с помощью объекта
Cursor
и методаcursor.fetchall()
; - Перебрать строки и получить для каждой ее соответствующее значение;
- Закрыть объект
Cursor
и соединение с базой данных SQLite; - Перехватить любые исключения, которые могут возникнуть в процессе работы.
Пример программы на Python для получения всех строк из таблицы sqlitedb_developers
.
Копировать Скопировано Use a different Browser
import sqlite3def read_sqlite_table(records):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")sqlite_select_query = """SELECT * from sqlitedb_developers"""
cursor.execute(sqlite_select_query)
records = cursor.fetchall()
print("Всего строк: ", len(records))
print("Вывод каждой строки")
for row in records:
print("ID:", row[0])
print("Имя:", row[1])
print("Почта:", row[2])
print("Добавлен:", row[3])
print("Зарплата:", row[4], end="\n\n")cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")read_sqlite_table()
Вывод:
Подключен к SQLite Всего строк: 6 Вывод каждой строки ID: 1 Имя: Oleg Почта: oleg04@gmail. com Добавлен: 2020-11-29 Зарплата: 8100.0 ... ID: 6 Имя: Nikita Почта: [email protected] Добавлен: 2020-11-27 Зарплата: 7400.0 Соединение с SQLite закрыто
В этом примере прямо отображаются строка и значение ее колонки. Если вам нужно использовать значения колонки в своей программе, то их можно сохранять в переменные Python. Для этого нужно написать, например, так: name = row[1]
.
Разбор примера
import sqlite3
:
- Эта строка импортирует в программу модуль sqlite3.
- С помощью классов и методов из этого модуля можно прямо взаимодействовать с базой данных.
sqlite3.connect()
и connection.cursor()
:
- С помощью
sqlite3.connect()
устанавливается соединение с базой данных SQLite из Python. - После этого готовится SELECT-запрос для получения всех строк из таблицы
sqlitedb_developers
. Она содержит пять колонок. - Метод
connection.cursor()
используется для получения объектаCursor
из объекта соединения.
cursor.execute()
и cursor.fetchall()
:
- Выполняется SELECT-операция с помощью метода
execute()
объектаCursor
. - После успешного выполнения запроса используется метод
cursor.fetchall()
для получения всех записей таблицыsqlitedb_developers
. - В конце используется цикл для перебора всех записей и вывода их по одному.
После того как все записи были получены, объект Cursor
закрывается с помощью cursor.close()
, а соединение с базой данных — с помощью sqliteConnection.close()
.
Примечание:
- Используйте
cursor.execute()
для выполнения запроса. cursor.fetchall()
— получение всех строк.cursor.fetchone()
— для одной строки.cursor.fetchmany(SIZE)
— для ограниченного количества строк.
Использование переменных в качестве параметров Select-запроса
Часто есть необходимость передать переменную в SELECT-запрос для проверки определенного условия.
Предположим, приложение хочет сделать запрос для получения информации о разработчиках, используя их id. Для этого необходим запрос с параметрами. Это такой запрос, где внутри используются заполнители (?) на месте параметров, которые потом заменяются реальными значениями.
cursor.execute("SELECT salary FROM sqlitedb_developers WHERE id = "ID из программы")
Рассмотрим пример.
Копировать Скопировано Use a different Browser
import sqlite3def get_developer_info(id):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")sql_select_query = """select * from sqlitedb_developers where id = ?"""
cursor.execute(sql_select_query, (id,))
records = cursor.fetchall()
print("Вывод ID ", id)
for row in records:
print("ID:", row[0])
print("Имя:", row[1])
print("Почта:", row[2])
print("Добавлен:", row[3])
print("Зарплата:", row[4], end="\n\n")cursor. close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")get_developer_info(2)
Вывод:
Подключен к SQLite Вывод ID 2 ID: 2 Имя: Viktoria Почта: [email protected] Добавлен: 2020-11-19 Зарплата: 6000.0 Соединение с SQLite закрыто
Получение нескольких строк из таблицы
В некоторых случаев попытка получить все строки из таблицы займет слишком много времени, особенно, если их там тысячи.
Для получения всех строк нужно больше ресурсов: памяти и времени обработки. А для улучшения производительности в таких случаях рекомендуется использовать метод fetchmany(size)
класса сursor
для получения фиксированного количество строк.
С помощью cursor.fetchmany(size)
можно указать, сколько строк требуется прочесть. Рассмотрим на примере:
Копировать Скопировано Use a different Browser
import sqlite3def read_limited_rows(row_size):
try:
sqlite_connection = sqlite3. connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")sqlite_select_query = """SELECT * from sqlitedb_developers"""
cursor.execute(sqlite_select_query)
print("Чтение ", row_size, " строк")
records = cursor.fetchmany(row_size)
print("Вывод каждой строки \n")
for row in records:
print("ID:", row[0])
print("Имя:", row[1])
print("Почта:", row[2])
print("Добавлен:", row[3])
print("Зарплата:", row[4], end="\n\n")cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")read_limited_rows(2)
Вывод:
Подключен к SQLite Чтение 2 строк Вывод каждой строки ID: 1 Имя: Oleg Почта: [email protected] Добавлен: 2020-11-29 Зарплата: 8100.0 ID: 2 Имя: Viktoria Почта: [email protected] Добавлен: 2020-11-19 Зарплата: 6000.0 Соединение с SQLite закрыто
Примечание: в этой программе был сделан запрос на получение двух записей. Но если в таблице их меньше, то вернется именно такое количество.
Получение одной строки из таблицы
Когда нужно получить одну строку из таблицы SQLite, стоит использовать метод fetchone()
класса cursor
. Этот метод необходим в тех случаях, когда известно, что запрос вернет одну строку.
cursor.fetchone()
получает только следующую строку из результата. Если же строк нет, то возвращается None
. Пример:
Копировать Скопировано Use a different Browser
import sqlite3def read_single_row(developer_id):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")sqlite_select_query = """SELECT * from sqlitedb_developers where id = ?"""
cursor.execute(sqlite_select_query, (developer_id, ))
print("Чтение одной строки \n")
record = cursor.fetchone()
print("ID:", record[0])
print("Имя:", record[1])
print("Почта:", record[2])
print("Добавлен:", record[3])
print("Зарплата:", record[4])cursor. close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")read_single_row(3)
Вывод:
Подключен к SQLite Чтение одной строки ID: 3 Имя: Valentin Почта: [email protected] Добавлен: 2020-11-23 Зарплата: 6500.0 Соединение с SQLite закрыто
- ТЕГИ
- SQLite
Максим
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Python Q https://yandex.ru/q/loves/python Online
Python QCEO [email protected]://secure.gravatar.com/avatar/b16f253879f7349f64830c64d1da4415?s=96&d=mm&r=gCEO PythonruPythonАлександрРедакторhttps://t.me/cashncarryhttps://pythonru.com/https://yandex.ru/q/profile/cashnc/PythonRu. [email protected] Zabrodin2018-10-26OnlinePython, Programming, HTML, CSS, JavaScriptРабота с PostgreSQL на Python с помощью psycopg2
Недавно мне понадобилось сходить в PostgreSQL из скрипта на Python. Была предпринята попытка воспользоваться для этого библиотекой py-postgresql, поскольку я успешно использовал ее в прошлом. Но оказалось, что py-postgresql не работает с последними версиями постгреса. В моем случае использовался PostgreSQL 11. Ну что же, тогда не будем выпендриваться, и возьмем используемый всеми psycopg2. Поскольку интерфейс psycopg2 заметно отличается от интерфейса py-postgresql, было решено написать небольшую памятку по использованию данной библиотеки.
Как обычно в мире Python, библиотека устанавливается через pip и при желании изолируется от других проектов с помощью virtualenv:
pip3 install psycopg2-binary
В MacOS вполне достаточно этой одной команды. В Linux может потребоваться вручную подтянуть библиотеку libpq, поскольку psycopg2 построен на ее базе:
sudo apt install libpq-dev
Соединение с СУБД осуществляется так:
import psycopg2
conn = psycopg2. connect(database=»mydb», user=»afiskon»,
password=»s3cr3t», host=»localhost», port=5432)
Иногда бывает полезно узнать используемую версию libpq. Она доступна через переменную psycopg2.__libpq_version__
. Переменная содержит число вроде 11002 (libpq 11.2) или 90613 (libpq 9.6.13).
Взаимодействие с базой осуществляется при помощи отдельного класса, cursor:
cur = conn.cursor()
Пример создания таблицы:
cur.execute(«CREATE TABLE users (id SERIAL PRIMARY KEY, » +
«login VARCHAR(64), password VARCHAR(64))»)
conn.commit()
Заметьте, что коммит транзакции осуществляется через класс connection, а не cursor.
Пример заполнения таблицы:
cur.execute(«INSERT INTO users (login, password) VALUES (%s, %s)»,
(«afiskon», «123»))
cur.execute(«INSERT INTO users (login, password) VALUES (%s, %s)»,
(«eax», «456»))
conn.commit()
То же самое, но через prepared statements:
cur.execute(«PREPARE insuser AS » +
«INSERT INTO users (login, password) VALUES ($1, $2)»)
cur. execute(«EXECUTE insuser(%s, %s)», («afiskon», «123»))
cur.execute(«EXECUTE insuser(%s, %s)», («eax», «456»))
conn.commit()
Пример SELECT-запроса:
cur.execute(«SELECT id, login, password FROM users»)
cur.fetchall()
# [(1, ‘afiskon’, ‘123’), (2, ‘eax’, ‘456’)]
Можно читать и по одному картежу:
cur.execute(«SELECT id, login, password FROM users»)
cur.fetchone()
# (1, ‘afiskon’, ‘123’)
cur.fetchone()
# (2, ‘eax’, ‘456’)
cur.fetchone() is None
# True
Также класс cursor может быть использован в цилке for:
cur.execute(«SELECT id, login, password FROM users»)
for row in cur:
print(row)
# (1, ‘afiskon’, ‘123’)
# (2, ‘eax’, ‘456’)
Параметрам запроса можно присваивать имена. Например, как в этом UPDATE-запросе:
cur.execute(«UPDATE users SET password = %(password)s WHERE » +
«login = %(login)s», {«login»:»eax», «password»:»789″})
conn.commit()
На плейсхолдерах значений всегда должно стоять %s
, даже если передается целое число или иной тип. Например, как в следующем DELETE-запросе:
cur.execute(«DELETE FROM users WHERE id = %s», (2,))
conn.commit()
Заметьте, что методу execute передается картеж из одного элемента. Если передать просто один аргумент без картежа, метод взорвется с ошибкой:
TypeError: ‘int’ object does not support indexing
Пример вызова хранимки:
cur.execute(«SELECT version()»)
cur.fetchall()
# [(‘PostgreSQL 11.5 (Ubuntu …трали-вали три педали’,)]
По завершении работы с курсором его следует закрыть:
cur.close()
Чтобы постоянно не думать про все эти conn.commit()
и cur.close()
, лучше выполнять транзакции в with-блоках:
with conn:
with conn.cursor() as cur:
cur.execute(«INSERT INTO users (login, password) » +
«VALUES (%s, %s)», («r2auk», «789»))
Заметьте, что conn также должен быть взят в with. Если во время исполнения кода не будет брошено исключение, транзакция закоммитится. Иначе она откатится. Так или иначе, все ресурсы, выделенные под cursor, будут освобождены. Соединение с СУБД остается открытым.
Чтобы явно откатить транзакцию, используйте метод rollback класса connection:
with conn:
with conn.cursor() as cur:
cur.execute(«DELETE FROM users»)
conn.rollback()
Чтобы закрыть соединение с СУБД, используйте метод close:
conn = psycopg2.connect( … )
try:
# работаем с базой
finally:
conn.close()
Конечно же, описать абсолютно все нюансы работы c psycopg2 в рамках одного поста не представляется возможным. Дополнительные сведения вы найдете в официальной документации.
А как вы работаете с PostgreSQL из Python?
Метки: PostgreSQL, Python, СУБД.
Запрос данных из базы данных с помощью fetchone() и fetchall()
fetchone() и fetchall() — это методы соединителя Python MySQL, которые используются для отображения данных. Этот коннектор помогает программам Python использовать базы данных MySQL. В приведенном ниже коде мы использовали MySQL с использованием Python для написания всех запросов и извлечения всех данных из баз данных.
1. Fetchone(): Метод Fetchone() используется, когда необходимо получить только первую строку из таблицы. Метод возвращает только первую строку из определенной таблицы. Этот метод также используется, когда мы хотим использовать метод cursor() для итерации. Этот метод увеличивает позицию курсора на 1, после чего возвращает следующую строку.
Этот метод нельзя использовать для объекта курсора, вместо этого мы запускаем запрос с использованием оператора SQL, т. е. «SELECT *», который извлекает первую строку/кортеж из таблицы. После этого мы используем метод fetchone() для переменной результата, возвращаемой оператором «SELECT *». Теперь метод извлекает первую строку из этого результата.
Синтаксис:
row = cursor.fetchone()
Шаги по использованию fetchone() в Mysql с использованием Python:
- Первый. импортировать коннектор MySQL
- Теперь создайте соединение с коннектором MySQL, используя метод connect()
- Затем создайте объект курсора с помощью метода cursor()
- Теперь создайте и выполните запрос, используя оператор «SELECT *» с execute( ) для получения данных
- Используйте метод fetchone() для переменной результата.
- вывести результат
Пример:
Предположим, есть таблица с именем «CUSTOMERS» и мы хотим получить из нее только первую строку, поэтому мы должны запустить приведенный ниже код.
Python
|
Выход:
2. Fetchall (). последний выполненный оператор из таблицы (возвращает список кортежей). Метод возвращает только первую строку из определенной таблицы, и если кортежей нет, он возвращает пустой список на выходе.Этот метод нельзя использовать для объекта курсора, вместо этого мы запускаем запрос с использованием оператора SQL, т. е. «SELECT *», который извлекает все строки/кортежи из таблицы. После этого мы используем метод fetchall() для переменной результата, возвращаемой оператором «SELECT *».
Синтаксис:
row = cursor.fetchall()
Шаги по использованию fetchall() в Mysql с использованием Python:
- Первый. импортировать коннектор MySQL
- Теперь создайте соединение с коннектором MySQL, используя метод connect()
- Затем создайте объект курсора с помощью метода cursor()
- Теперь создайте и выполните запрос, используя оператор «SELECT *» с execute( ) для получения данных
- Используйте метод fetchall() для переменной результата.
- распечатать результат, используя для каждого цикла, чтобы отобразить все
Пример:
Предположим, есть таблица с именем «CUSTOMERS» и мы хотим получить из нее все строки, поэтому мы должны запустить приведенный ниже код.
Python
|
Метод | Описание |
---|---|
выборка() | Этот метод возвращает одну запись в виде кортежа. Если записей больше нет, он возвращает None . |
fetchmany(количество_записей) | Этот метод принимает количество записей для выборки и возвращает кортеж, где каждая запись сама по себе является кортежем. Если записей больше нет, то возвращается пустой кортеж. |
Использование fetchone()
1 2 3 4 5 6 7 8 910 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | из __future__ import print_function импортировать MySQLdb как мой пытаться: БД = my.connect (хост = "127.0.0.1", пользователь = «корень», пароль="", БД = "мир" ) курсор = db. курсор() sql = "выберите * из города, где идентификатор < 10" number_of_rows = cursor.execute (sql) print(cursor.fetchone()) # получить только первую строку db.close() кроме my.DataError как e: распечатать("Ошибка Данных") печать (е) кроме my.InternalError как e: распечатать("Внутренняя ошибка") печать (е) кроме my.IntegrityError как e: print("Ошибка Целостности") печать (е) кроме my.OperationalError как e: распечатать("Ошибка операции") печать (е) кроме my.NotSupportedError как e: print("Неподдерживается ошибка") печать (е) кроме my.ProgrammingError как e: print("Ошибка программирования") печать (е) кроме : print("Произошла неизвестная ошибка") |
Перебор результата с помощью
fetchone()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | из __future__ import print_function импортировать MySQLdb как мой пытаться: БД = my. connect (хост = "127.0.0.1", пользователь = «корень», пароль="", БД = "мир" ) курсор = db.курсор() sql = "выберите * из города, где идентификатор < 10" number_of_rows = cursor.execute (sql) пока верно: строка = курсор.fetchone() если строка == Нет: ломать печать (строка) db.close() кроме my.DataError как e: распечатать("Ошибка Данных") печать (е) кроме my.InternalError как e: распечатать("Внутренняя ошибка") печать (е) кроме my.IntegrityError как e: print("Ошибка Целостности") печать (е) кроме my.OperationalError как e: распечатать("Ошибка операции") печать (е) кроме my.NotSupportedError как e: print("Неподдерживается ошибка") печать (е) кроме my.ProgrammingError как e: print("Ошибка программирования") печать (е) кроме : print("Произошла неизвестная ошибка") |
Использование fetchmany()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | из __future__ import print_function импортировать MySQLdb как мой пытаться: БД = my. connect (хост = "127.0.0.1", пользователь = «корень», пароль="", БД = "мир" ) курсор = db.курсор() sql = "выберите * из города, где идентификатор < 10" number_of_rows = cursor.execute (sql) print(cursor.fetchmany(2)) # извлекаем только первые 2 строки db.close() кроме my.DataError как e: распечатать("Ошибка Данных") печать (е) кроме my.InternalError как e: распечатать("Внутренняя ошибка") печать (е) кроме my.IntegrityError как e: print("Ошибка Целостности") печать (е) кроме my.OperationalError как e: распечатать("Ошибка операции") печать (е) кроме my.NotSupportedError как e: print("Неподдерживается ошибка") печать (е) кроме my.ProgrammingError как e: print("Ошибка программирования") печать (е) кроме : print("Произошла неизвестная ошибка") |
Перебор результата с помощью fetchmany()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | из __future__ import print_function импортировать MySQLdb как мой пытаться: БД = my. connect (хост = "127.0.0.1", пользователь = «корень», пароль="", БД = "мир" ) курсор = db.курсор() sql = "выберите * из города, где идентификатор < 10" number_of_rows = cursor.execute (sql) пока верно: two_rows = курсор.fetchmany(2) если не two_rows: ломать печать (две_строки) db.close() кроме my.DataError как e: распечатать("Ошибка Данных") печать (е) кроме my.InternalError как e: распечатать("Внутренняя ошибка") печать (е) кроме my.IntegrityError как e: print("Ошибка Целостности") печать (е) кроме my.OperationalError как e: распечатать("Ошибка операции") печать (е) кроме my.NotSupportedError как e: print("Неподдерживается ошибка") печать (е) кроме my.ProgrammingError как e: print("Ошибка программирования") печать (е) кроме : print("Произошла неизвестная ошибка") |
Другие учебники (спонсоры)
Этот сайт щедро поддерживается Датакемп. DataCamp предлагает онлайн-интерактив Учебники по Python для науки о данных. Присоединяйтесь к более чем миллиону других учащихся и получите сегодня начал изучать Python для науки о данных!
Включите JavaScript для просмотра комментариев с помощью Disqus.
Как использовать fetchall, fetchmany(), fetchone() курсора Python для чтения записей из SQL | Джек Донг
В этой статье демонстрируется использование методов класса курсора Python fetchall , fetchmany (), fetchone () для извлечения строк из таблицы базы данных. Эта статья относится ко всем реляционным базам данных, например, MySQL , PostgreSQL .
Обычно мы используем следующий модуль Python для работы с базой данных.
- MySQL — — — — MySQL Connector Pytho
- PostgreSQL — — — — Psycopg2
- SQLite — — — — sqlite3
Прежде всего, интерфейсы или модули соответствуют Спецификации API базы данных Python версии 2. 0 (PEP 249). В этой статье я покажу, как использовать fetchall
, fetchmany()
, fetchone()
для извлечения данных из баз данных MySQL, PostgreSQL, SQLite.
Прежде чем продолжить, сначала поймите, для чего используются функции fetchall(), fetchmany(), fetchone().
cursor.fetchall()
возвращает все строки результата запроса. Он возвращает все строки в виде списка кортежей. Пустой список возвращается, если нет записей для извлечения.
cursor.fetchmany(size)
возвращает количество строк, указанное аргументом размера. При повторном вызове этот метод извлекает следующий набор строк результата запроса и возвращает список кортежей. Если больше нет доступных строк, он возвращает пустой список.
Метод cursor.fetchone()
возвращает одну запись или None, если больше нет доступных строк.
Я создал таблицу MySQL_Test в своей базе данных. Теперь он содержит три строки. давайте посмотрим, как использовать fetchall для получения всех записей.
Теперь посмотрим примеры.
Теперь посмотрим, как использовать fetchall
для получения всех записей. Чтобы получить все строки из таблицы базы данных, вам нужно выполнить следующие простые шаги:
- Создать соединение с базой данных из Python.
- Определите запрос SELECT. Здесь вам нужно знать таблицу и детали ее столбца.
- Выполните запрос SELECT, используя метод
cursor.execute()
. - Получить набор результатов (все строки) из объекта курсора с помощью
курсор.fetchall()
. - Перебрать ResultSet с помощью цикла for и получить значения столбцов каждой строки.
- Закройте соединение с базой данных Python.
- Перехват любых исключений SQL, которые могут возникнуть во время процесса.
import sqlite3def getAllRecords():
try:
connection = sqlite3. connect('SqlTest.db')
cursor = connection.cursor()
print("Подключено к SQLite")sqlite_select_query = "" "SELECT * from database_score"""
cursor.execute(sqlite_select_query)
records = cursor.fetchall()
print("Всего строк: ", len(records))
print("Печать каждой строки")
для строки в записях:
print("Имя : ", строка[0])
print("Электронная почта: ", строка[1])
print("TestDate: ", строка[2])
print("Оценка: ", строка[3])
print( "\n") cursor.close()кроме sqlite3.Error as error:
print("Не удалось прочитать данные из таблицы", ошибка)
finally:
if (connection):
connection.close()
print("Соединение Sqlite закрыто")getAllRecords()
Вывод:
Подключено к SQLite
Всего строк: 3 /12/04
Оценка: 86Имя: Тим
Эл. 04.12
Оценка: 81Соединение Sqlite закрыто
Что мне нравится в Python DB API, так это его гибкость. В реальном мире извлечение всех строк одновременно может оказаться невозможным. Таким образом, Python DB API решает эту проблему, предоставляя различные версии функции fetch() класса Cursor. Наиболее часто используемая версия — cursor.fetchmany(size)
.
Синтаксис:
rows = cursor.fetchmany([size=cursor.arraysize])
- Здесь размер — это количество строк, которые необходимо извлечь . Этот метод извлекает следующий набор строк результата запроса и возвращает список кортежей. Если больше нет доступных строк, он возвращает пустой список.
- Метод курсора
fetchmany()
возвращает количество строк, указанное аргументом размера. значение по умолчанию равно 1. Если указанный размер равен 100, возвращается 100 строк.
import sqlite3def getlimitedRows(size):
try:
connection = sqlite3.connect('SqlTest.db')
cursor = connection.cursor()
print("Подключено к базе данных")sqlite_select_query = """SELECT * from database_score"""
cursor. execute(sqlite_select_query)
records = cursor.fetchmany(size)
print("Итоговая выборка", размер," rows")
print("Печать каждой строки")
для строки в записях:
print("Имя: ", row[0])
print("Email: ", row[1])
print("TestDate: ", row[2])
print("Оценка: ", row[3])
print("\n")cursor.close()
кроме sqlite3.Error as error:
print("Не удалось прочитать данные из таблицы", ошибка)
finally:
if (соединение):
connection.close()
print("Соединение Sqlite закрыто")getlimitedRows(2)
Вывод :
Подключен к SQLite
Всего строк: 2
Печать каждой строки Имя: Джейкоб
Электронная почта: [email protected]
TestDate: 04.12.2020
Оценка: 86Имя: Тим
Электронная почта: [email protected]
TestDate: 06.12.2020
Оценка: 84Соединение Sqlite закрыто
Примечание :
- fetchmany() возвращает пустой список, когда в таблице больше нет доступных строк.
- A
ProgrammingError
возникает, если предыдущий вызов execute*() не привел к набору результатов или вызов еще не был выполнен. -
fetchmany()
возвращает меньше строк, если таблица содержит меньшее количество строк, заданное аргументом SIZE.
Что произойдет, если мы повторно вызовем cursor.fetchmany(size)
после выполнения SQL-запроса. Например, мы выполнили запрос, и он вернул результат запроса из 10 строк. Затем мы получили первые 2 строки, используя курсор.fetchmany(2)
.
Опять же, мы вызвали cursor.fetchmany(2)
, после чего он вернет следующие 2 строки.
- Python DB API позволяет нам извлекать только одну строку. Чтобы получить одну строку из набора результатов, мы можем использовать
cursor.fetchone()
. Этот метод возвращает один кортеж. - Может возвращать значение none, если в результирующем наборе нет доступных строк.
cursor.fetchone()
увеличивает позицию курсора на единицу и возвращает следующую строку.
Теперь посмотрим на пример.
import sqlite3def getSingleRows():
try:
connection = sqlite3.connect('SqlTest.db')
cursor = connection.cursor()
print("Подключено к базе данных") sqlite_select_query = """SELECT * from database_score """
cursor.execute(sqlite_select_query)
print("Выборка одной строки")
record = cursor.fetchone()
print(record) print("Выборка следующей строки")
record = cursor.fetchone()
print (запись) cursor.close(), кроме sqlite3.Error as error:
print("Не удалось прочитать данные из таблицы", ошибка)
finally:
if (соединение):
connection.close()
print("Соединение Sqlite закрыто")getSingleRows()
Вывод:
Подключено в базу данныхИзвлечение одной строки
(«Джейкоб», «Джейкоб@gmail.com», «2020/12/04», 86)Извлечение следующей строки
(«Тим», «Тим@gmail.com», « 2020/12/06', 84)Соединение Sqlite закрыто
Запрос данных с использованием методов fetchone(), fetchmany() и fetchall()
Резюме : в этом руководстве вы узнаете, как выбирать данные из базы данных Oracle, используя методы fetchone()
, fetchmany()
и fetchall()
.
Чтобы выбрать данные из базы данных Oracle в программе Python, выполните следующие действия:
- Сначала установите соединение с базой данных Oracle с помощью метода
cx_Oracle.connect()
. - Во-вторых, создайте объект
Cursor
из объекта Connection с помощьюМетод Connection.cursor()
. - В-третьих, выполните оператор SQL для выбора данных из одной или нескольких таблиц с помощью метода Cursor.execute().
- В-четвертых, выборка строк с использованием методов
Cursor.fetchone()
,Cursor.fetchmany()
иCursor.fetchall()
. - Наконец, освободите объекты
Cursor
иConnection
, используя методыCursor.close()
иConnection.Close()
. Если вы хотите выпуститьКурсор
иСоединение
автоматически, можно использовать блокс
.
Мы будем использовать таблицу клиентов
из примера базы данных:
и следующий модуль config. py
:
Язык кода: Python (python)
username = 'OT' пароль = '<пароль>' dsn = 'localhost/pdborcl' порт = 1512 кодировка = 'UTF-8'
Запрос данных с помощью
Cursor.fetchone() 9Метод 0052 Следующий fetchone.py
иллюстрирует, как выбирать данные из таблицы клиентов
:
import cx_Oracle
импорт конфигурации
sql = 'выберите идентификатор_клиента, имя' \
'от клиентов' \
'заказать по имени'
пытаться:
с cx_Oracle.connect(
config.имя пользователя,
config.пароль,
конфиг.dsn,
encoding=config.encoding) как соединение:
с connection. cursor() в качестве курсора:
курсор.execute(sql)
пока верно:
строка = курсор.fetchone()
если строка отсутствует:
ломать
печать (строка)
кроме cx_Oracle.Error как ошибка:
распечатать (ошибка)
Язык кода: Python (python)
Несмотря на то, что Cursor.fetchone()
возвращает по одной строке за раз, он всегда извлекает данные из базы данных Oracle в пакетах с размером пакета по умолчанию равным Cursor.arraysize
.
Для повышения производительности можно настроить значение Cursor.arraysize
перед вызовом метода Cursor.execute()
.
Обратите внимание, что увеличение значения Cursor.arraysize
помогает уменьшить количество обращений к базе данных. Однако это увеличивает объем требуемой памяти.
Запрос данных с помощью метода
Cursor.fetchmany()
Если вы хотите обрабатывать строки пакетами, вы можете использовать метод Cursor. fetchmany()
. В этом случае вы передаете размер пакета методу Cursor.fetchmany()
. Размер пакета по умолчанию равен Cursor.arraysize
:
import cx_Oracle
импорт конфигурации
sql = 'выберите идентификатор_клиента, имя' \
'от клиентов' \
'заказать по имени'
размер_пакета = 20
пытаться:
с cx_Oracle.connect(
config.имя пользователя,
config.пароль,
конфиг.dsn,
encoding=config.encoding) как соединение:
с connection.cursor() в качестве курсора:
# выполнить оператор SQL
курсор.execute(sql)
пока верно:
# получить строки
строки = cursor.fetchmany (размер_пакета)
если не строки:
ломать
# отображать строки
для строки в строке:
печать (строка)
кроме cx_Oracle. Error как ошибка:
распечатать (ошибка)
Язык кода: Python (python)
Запрос данных с помощью метода
Cursor.fetchall()
)
метод:Язык кода: Python (python)
импорт cx_Oracle импорт конфигурации sql = 'выберите идентификатор_клиента, имя' \ 'от клиентов' \ 'заказать по имени' пытаться: # подключиться к базе данных Oracle с cx_Oracle.connect( config.имя пользователя, config.пароль, конфиг.dsn, encoding=config.encoding) как соединение: с connection.cursor() в качестве курсора: # выполнить оператор SQL курсор.execute(sql) # получить все строки строки = курсор.fetchall() если строки: для строки в строке: печать (строка) кроме cx_Oracle.Error как ошибка: распечатать (ошибка)
В этом руководстве вы узнали, как использовать методы fetchone()
, fetchmany()
и fetchall()
объекта Cursor
для получить данные из базы данных Oracle.
Было ли это руководство полезным?
Класс курсора — документация Psycopg 2.9.3
- класс курсор
Позволяет коду Python выполнять команду PostgreSQL в сеансе базы данных. Курсоры создаются
метод connection.cursor()
: они привязан к соединению на все время жизни, и все команды выполняется в контексте сеанса базы данных, обернутого соединением.Курсоры, созданные из одного соединения, не изолированы, т. е. любые изменения, сделанные в базе данных курсором, немедленно видны другие курсоры. Курсоры, созданные из разных соединений, могут или не могут быть изолированы в зависимости от уровня изоляции соединений. См. также
rollback()
иcommit()
метода.Курсоры , а не потокобезопасны: многопоточное приложение может создавать много курсоров из одного и того же соединения и должен использовать каждый курсор из единая нить. Дополнительные сведения см. в разделе Безопасность потоков и процессов.
Курсоры можно использовать в качестве менеджеров контекста: выход из контекста закроет курсор.
с conn.cursor() как curs: курс.execute(SQL) # курсор теперь закрыт
- описание
Доступный только для чтения атрибут, описывающий результат запроса. Это последовательность из
экземпляров столбца
, каждый описание одного столбца результатов по порядку. АтрибутНет
для операции, которые не возвращают строки или если курсор не имеет операция, вызванная с помощью методовexecute*()
.Для совместимости с DB-API каждый объект можно распаковать как Последовательность из 7 элементов: атрибуты, перенастроенные таким образом, следующие. Для получения дополнительной информации и других доступных атрибутов см.
Столбец
документации.имя
: возвращено имя столбца.type_code
: OID PostgreSQL для столбец.display_size
: фактическая длина столбец в байтах.internal_size
: размер в байтах столбец, связанный с этим столбцом на сервере.точность
: общее количество значащие цифры в столбцах типаЦИФРОВОЙ
.Нет
для других типов.шкала
: количество десятичных цифр в дробная часть в столбцах типаNUMERIC
.Нет
для других типов.null_ok
: всегдаНет
как непросто для извлечения из libpq.
Изменено в версии 2.4: если возможно, описания столбцов именуются кортежами вместо обычные кортежи.
Изменено в версии 2.8: описания столбцов являются экземплярами
Столбец
, раскрывающий доп. атрибуты.
- закрыть()
Закройте курсор сейчас (а не всякий раз, когда выполняется
del
). С этого момента курсор будет непригоден для использования; анИнтерфейсная ошибка
будет вызвана, если какая-либо операция пытался с помощью курсора.Изменено в версии 2.5: если курсор используется в операторе
с
, метод автоматически вызывается в концес
блокировать.
- закрыто
Логический атрибут только для чтения: указывает, закрыт ли курсор (
Верно
) или нет (Ложь
).Расширение API БД
Атрибут
закрытый
является расширением Psycopg для API БД 2.0.Новое в версии 2.0.7.
- соединение
Атрибут только для чтения, возвращающий ссылку на соединение
- имя
Доступный только для чтения атрибут, содержащий имя курсора, если он был создан как именованный курсор с помощью
connection.cursor()
илиNone
, если это курсор на стороне клиента. См. Курсоры на стороне сервера.Расширение DB API
Атрибут
name
является расширением Psycopg для DB API 2. 0.
- прокручиваемый
Атрибут чтения/записи: указывает, объявлен ли именованный курсор
ПРОКРУТКА
, следовательно, может прокручиваться назад (используяпрокрутка()
). ЕслиTrue
, курсор можно прокручивать назад, еслиFalse
, он никогда не прокручивается. ЕслиНет
(по умолчанию), курсор опция прокрутки не указана, обычно, но не всегда означает «нет» прокрутка назад (см. примечанияDECLARE
).Примечание
установите значение перед вызовом
execute()
или используйтеconnection.cursor()
прокручиваемый параметр, иначе значение не будет иметь никакого эффекта.Новое в версии 2.5.
Расширение DB API
Атрибут
с возможностью прокрутки
является расширением Psycopg для DB API 2.0.
- удержать
Атрибут чтения/записи: указывает, должно ли время жизни именованного курсора выходить за пределы текущей транзакции, т. е. возможно извлекать из курсора даже после
connection.commit()
(но не послесоединение.откат()
). См. Курсоры на стороне сервераПримечание
установите значение перед вызовом
execute()
или используйтеconnection.cursor()
скрыть параметр , иначе значение не будет иметь никакого эффекта.Новое в версии 2.4.3.
Расширение API БД
Атрибут
скрыть
является расширением Psycopg для API БД 2.0.
Способы выполнения команд
- выполнить( запрос , варс=нет )
Выполнить операцию с базой данных (запрос или команду).
Параметры могут быть предоставлены в виде последовательности или сопоставления и будут привязаны к переменные в операции. Переменные указываются либо с помощью позиционные (
%s
) или именованные (%( имя )s
) заполнители. Видеть Передача параметров в SQL-запросы.Метод возвращает
Нет
. Если запрос был выполнен, возвращаемый значения могут быть получены с помощьюfetch*()
метода.
- executemany( запрос , vars_list )
Выполнить операцию базы данных (запрос или команду) для всех параметров кортежи или сопоставления, найденные в последовательности vars_list .
Функция в основном полезна для команд, обновляющих базу данных: любой результирующий набор, возвращаемый запросом, отбрасывается.
Параметры привязаны к запросу с использованием тех же правил, которые описаны в
метод execute()
.Предупреждение
В текущей реализации этот метод не быстрее, чем выполнение
execute()
в цикле. Для лучшей производительности вы можете использовать функции, описанные в Помощниках быстрого выполнения.
- callproc( procname [ параметры ])
Вызов хранимой процедуры базы данных с заданным именем. Последовательность параметры должны содержать по одной записи для каждого аргумента, который процедура ожидает. Поддерживаются перегруженные процедуры. Именованные параметры могут быть используется путем предоставления параметров в виде словаря.
В настоящее время эта функция несовместима с DBAPI. Возвращаемое значение предполагается состоять из последовательности параметров с измененным выводом и входные/выходные параметры. В будущих версиях DBAPI-совместимый возвращаемое значение может быть реализовано, но пока функция возвращает None.
Процедура может предоставить набор результатов в качестве вывода. Затем это делается доступны через стандартные методы
fetch*()
.Изменено в версии 2.7: добавлена поддержка именованных аргументов.
Примечание
callproc()
может использоваться только с функциями PostgreSQL, но не с процедурами, введенными в PostgreSQL 11, которые требуют операторCALL
для запуска. Пожалуйста, используйте обычныйexecute()
для их запуска.
- mogrify( операция [ параметры ])
Вернуть строку запроса после привязки аргументов. Возвращаемая строка именно тот, который будет отправлен в базу данных, на которой работает
метод execute()
или аналогичный.Возвращаемая строка всегда представляет собой строку байтов.
>>> cur.mogrify("ВСТАВИТЬ В тест (число, данные) ЗНАЧЕНИЯ (%s, %s)", (42, 'бар')) "ВСТАВИТЬ В тест (число, данные) ЗНАЧЕНИЯ (42, E'bar')"
Расширение DB API
Метод
mogrify()
является расширением Psycopg для DB API 2.0.
- setinputsizes ( размеры )
Этот метод предоставляется в соответствии с DB API 2.0. В настоящее время ничего не делает, но безопасно вызывать его.
Методы поиска результатов
Следующие методы используются для чтения данных из базы данных после
выполнить()
вызов.Примечание
курсор
объекты повторяемы, поэтому вместо вызова явноfetchone()
в цикле, сам объект может использовать:>>> cur.execute("SELECT * FROM test;") >>> для записи в cur: ... распечатать запись ... (1, 100, "abc'def") (2, нет, дадаизм) (3, 42, 'бар')
Изменено в версии 2.4: перебор именованного курсора извлекает
itersize
записей за раз из серверной части. Раньше за одно обращение извлекалась только одна запись, в результате чего в большой накладной.- выборка ()
Получить следующую строку набора результатов запроса, возвращая один кортеж, или
Нет
, если данных больше нет:>>> cur.execute("SELECT * FROM test WHERE id = %s", (3,)) >>> cur.fetchone() (3, 42, 'бар')
Ошибка
ProgrammingError
возникает, если предыдущий вызов toexecute*()
не произвел никакого результирующего набора или никакого вызова не было. пока что.
- fetchmany([ size=cursor.arraysize ])
Получить следующий набор строк результата запроса, возвращая список кортежи. Пустой список возвращается, когда больше нет доступных строк.
Количество строк для выборки за один вызов задается параметром. Если он не указан, курсор
размер массива
определяет количество строк, которые необходимо извлечь. Метод должен попытаться получить как много строк, как указано параметром размера. Если это невозможно из-за того, что указанное количество строк недоступно, меньше строк можно вернуть:>>> cur.execute("SELECT * FROM test;") >>> cur.fetchmany(2) [(1, 100, "abc'def"), (2, нет, 'дада')] >>> cur.fetchmany(2) [(3, 42, 'бар')] >>> cur.fetchmany(2) []
A
Ошибка программирования
возникает, если предыдущий вызовexecute*()
не создал никакого результирующего набора или вызов еще не был выполнен.Обратите внимание, что размер зависит от производительности. параметр. Для оптимальной производительности обычно лучше использовать
размер массива
атрибут. Если используется параметр размера, то для него лучше сохранить одно и то же значение от одногоfetchmany()
вызов следующего.
- выборка()
Извлечь все (оставшиеся) строки результата запроса, возвращая их в виде списка кортежей. Пустой список возвращается, если больше нет записей для принести.
>>> cur.execute("SELECT * FROM test;") >>> cur.fetchall() [(1, 100, "abc'def"), (2, нет, 'дада'), (3, 42, 'бар')]
Ошибка
ProgrammingError
возникает, если предыдущий вызовexecute*()
не создал никакого результирующего набора или вызов еще не был выполнен.
- прокрутка ( значение [ режим = 'относительный' ])
Прокрутите курсор в наборе результатов до новой позиции в соответствии с в режим.
Если режим
относительным
(по умолчанию), значение берется как смещение относительно текущая позиция в наборе результатов, если установлено значениеabsolute
, value указывает абсолютную целевую позицию.Если операция прокрутки оставит набор результатов,
Возникла ошибка ProgrammingError
, а положение курсора изменилось. не изменился.Примечание
В соответствии с DB API 2.0, исключение возникает при выходе курсора границы должно было быть
IndexError
. Лучший вариант возможно, чтобы поймать оба исключения в вашем коде:попробуйте: курс. прокрутка (1000 * 1000) кроме (ProgrammingError, IndexError), кроме: сделка_с_ит (отл.)
Метод можно использовать как для клиентских курсоров, так и для серверные курсоры. Курсоры на стороне сервера обычно может прокручиваться назад, только если объявлено
прокручиваемым
. Перемещение за пределы курсора на стороне сервера не приводит к исключение, если бэкэнд ничего не вызывает (Postgres не сообщает нам надежным способом, если мы вышли за границы).
- размер массива
Этот атрибут для чтения/записи определяет количество строк, которые необходимо извлечь за один раз. время с
fetchmany()
. По умолчанию это 1, что означает получение по одной строке за раз.
- размер
Атрибут чтения/записи, указывающий количество строк, которые необходимо извлечь из серверной части при каждом круговом обходе сети во время итерации именованного курсора. по умолчанию 2000.
Новое в версии 2.4.
Расширение API БД
Атрибут
itersize
является расширением Psycopg для DB API 2.0.
- количество строк
Этот атрибут только для чтения указывает количество строк, которые
execute*()
произведено (для операторов DQL какSELECT
) или затронуты (для DML операторов типаUPDATE
илиВСТАВИТЬ
).Атрибут равен -1, если не было выполнено
execute*()
. курсор или количество строк последней операции, если это невозможно определяется интерфейсом.Примечание
Интерфейс DB API 2.0 резервирует переопределение последнего случая для чтобы объект возвращал
None
вместо -1 в будущих версиях спецификации.
- номер строки
Этот доступный только для чтения атрибут предоставляет текущий отсчитываемый от 0 индекс курсор в наборе результатов или
None
, если индекс не может быть определенный.Индекс можно рассматривать как индекс курсора в последовательности (результат установлен). Следующая операция выборки извлечет строку, проиндексированную
номер строки
в этой последовательности.
- Ластровид
Этот атрибут только для чтения содержит OID последней вставленной строки. курсором. Если таблица не была создана с поддержкой OID или последняя операция не является вставкой одиночной записи, для атрибута установлено значение
Нет
.Примечание
PostgreSQL в настоящее время рекомендует не создавать OID для таблиц и по умолчанию для
CREATE TABLE
они не поддерживаются.INSERT ... RETURNING Синтаксис
, доступный в PostgreSQL 8.3, позволяет больше гибкости.
- запрос
Доступный только для чтения атрибут, содержащий тело последнего запроса, отправленного в бэкэнд (включая связанные аргументы) в виде строки байтов.
Нет
если нет запрос уже выполнен:>>> cur.execute("ВСТАВИТЬ В тест (число, данные) ЗНАЧЕНИЯ (%s, %s)", (42, 'бар')) >>> cur.query "ВСТАВИТЬ В тест (число, данные) ЗНАЧЕНИЯ (42, E'bar')"
Расширение API БД
Атрибут
запроса
является расширением Psycopg для API БД 2.0.
- сообщение о состоянии
Доступный только для чтения атрибут, содержащий сообщение, возвращенное последним команда:
>>> cur.execute("ВСТАВИТЬ В тест (число, данные) ЗНАЧЕНИЯ (%s, %s)", (42, 'бар')) >>> текущее сообщение о статусе 'ВСТАВИТЬ 0 1'
Расширение DB API
Атрибут
statusmessage
является расширением Psycopg для API БД 2. 0.
- приведение( оид , с )
Преобразовать значение из строкового представления PostgreSQL в Python объект.
Используйте наиболее специфические из типографов, зарегистрированных
register_type()
.Новое в версии 2.4.
Расширение DB API
Метод
cast()
является расширением Psycopg для DB API 2.0.
- tzinfo_factory
Фабрика часовых поясов, используемая для обработки таких типов данных, как
TIMESTAMP С ЧАСОВЫМ ПОЯСОМ
. Это должен бытьtzinfo
объект. По умолчаниюdatetime.timezone
.Изменено в версии 2.9: ранее фабрикой по умолчанию была
psycopg2.tz.FixedOffsetTimezone
.
- следующий набор()
Этот метод не поддерживается (в PostgreSQL нет нескольких наборы) и вызовет исключение
NotSupportedError
.
- установить выходной размер ( размер [ столбец ])
Этот метод предоставляется в соответствии с DB API 2. 0. В настоящее время ничего не делает, но безопасно вызывать его.
Методы, связанные с КОПИРОВАНИЕМ
Эффективно копировать данные из файловых объектов в базу данных и обратно. Видеть Использование COPY TO и COPY FROM для обзора.
Расширение DB API
Команда
COPY
является расширением PostgreSQL для стандарта SQL. Таким образом, его поддержка является расширением Psycopg для DB API 2.0.- copy_from ( файл , таблица , sep='\\t' , null='\\\\N' , размер=8192 , столбцы=нет )
Чтение данных из файлоподобного объекта файла с добавлением их к таблица с именем таблица .
- Параметры
файл – файловый объект, из которого считываются данные. Он должен иметь оба
чтение()
ичтение строки()
методы.таблица – имя таблицы, в которую копируются данные.
сен – в файле ожидается разделитель столбцов. По умолчанию вкладка.
null – текстовое представление
NULL
в файле. По умолчанию используется строка из двух символов\N
.размер – размер буфера, используемого для чтения из файла.
столбца — повторяемый с именем столбца для импорта. Длина и типы должны соответствовать содержимому файла для чтения. Если не указано, предполагается, что вся таблица соответствует файловая структура.
Пример:
>>> f = StringIO("42\tfoo\n74\tbar\n") >>> cur.copy_from(f, 'тест', columns=('число', 'данные')) >>> cur.execute("выбрать * из теста, где id > 5;") >>> cur.fetchall() [(6, 42, 'фу'), (7, 74, 'бар')]
Изменено в версии 2.0.6: добавлен параметр столбца .
Изменено в версии 2.4: чтение данных из файлов, реализующих интерфейс
io. TextIOBase
кодируются в соединении, кодируя
при отправке на бэкэнд.Изменено в версии 2.9: имена таблиц и полей теперь заключаются в кавычки. Если вам нужно указать таблицу с указанием схемы используйте
copy_expert()
.
- copy_to( файл , таблица , sep='\\t' , null='\\\\N' , столбцы=нет )
Записать содержимое таблицы с именем таблица в в виде файла объект файл . Обзор см. в разделе Использование COPY TO и COPY FROM.
- Параметры
файл – файловый объект для записи данных. Он должен иметь
метод write()
.таблица – имя таблицы, из которой копируются данные.
сен – в файле ожидается разделитель столбцов. По умолчанию вкладка.
null – текстовое представление
NULL
в файле. По умолчанию используется строка из двух символов\N
.столбца — повторяемый с именем столбца для экспорта. Если не указано, экспортировать все столбцы.
Пример:
>>> cur.copy_to(sys.stdout, 'тест', sep="|") 1|100|abc'def 2|\N|дада ...
Изменено в версии 2.0.6: добавлен параметр столбца .
Изменено в версии 2.4: данные отправляются в файлы, реализующие интерфейс
io.TextIOBase
. декодируются в соединении, кодируются
при чтении из бэкенда.Изменено в версии 2.9: имена таблиц и полей теперь заключаются в кавычки. Если вам нужно указать таблица с указанием схемы, пожалуйста, используйте
копировать_эксперт()
.
- copy_expert ( sql , файл , размер = 8192 )
Отправить составленное пользователем заявление
COPY
. Метод полезен для обрабатывать все параметры, доступные в PostgreSQL (см.КОПИРОВАТЬ документацию команды
).- Параметры
sql — оператор
COPY
для выполнения.файл — файлоподобный объект для чтения или записи (согласно sql ).
size – размер буфера чтения, который будет использоваться в
COPY FROM
.
Оператор sql должен иметь форму
COPY table TO STDOUT
для экспортатаблицы
в файл объект передается как аргумент илиCOPY table FROM STDIN
для импорта содержимого файл объект втаблица
. Если вам нужно составитьКОПИРОВАТЬ оператор
динамически (поскольку таблица, поля или запрос параметры находятся в переменных Python) вы можете использовать предоставленные объекты модулемpsycopg2.sql
.файл должен быть читаемым файлоподобным объектом (согласно требованиям
copy_from()
) для sql операторCOPY... FROM STDIN
или доступный для записи (как требуетcopy_to()
) дляКОПИРОВАТЬ ... НА СТАНДАРТНЫЙ НОМЕР
.Пример:
>>> cur.copy_expert("КОПИРОВАТЬ тест В STDOUT С ЗАГОЛОВКОМ CSV", sys.stdout) идентификатор, номер, данные 1,100, abc'def 2, дада ...
Новое в версии 2.0.6.
Изменено в версии 2.4: обработаны файлы, реализующие интерфейс
io.TextIOBase
. используя данные Unicode вместо байтов.
Взаимодействие с другими модулями C API
- pgresult_ptr
Возвращает внутренний
PGresult*
курсора как целое число. Полезно пройти необработанную структуру результата libpq для функций C, например. черезctypes
:>>> импорт ctypes >>> libpq = ctypes.pydll.LoadLibrary(ctypes.