Форум сайта python.su
На Windows использую Python 3.4.2 (x86) и MySql Connector 2.0.3.
import mysql.connector as connector
def select_computed_series_ids(self): connection = None cursor = None try: connection = connector.connect( host=self.__host, database=self.__database, password=self.__password, user=self.__user) cursor = connection.cursor() cursor.execute(""" SELECT series_id FROM series AS WHERE status <> 'X' -- LIMIT 5 """) return {item[0] for item in cursor} finally: if cursor: cursor.close() if connection: connection.close()
def select_computed_series_ids(self): connection = None cursor = None try: connection = connector.connect( host=self.__host, database=self.__database, password=self.__password, user=self.__user) cursor = connection.cursor(prepared=True) query = """ SELECT series_id FROM series WHERE series_id > %s AND status <> 'X' ORDER BY series_id LIMIT 1000 """ last_series_id = 0 ids = [] while True: cursor.execute(query, (last_series_id,)) row = cursor.fetchone() if row is None: break while row is not None: last_series_id = row[0] ids.append(last_series_id) row = cursor.fetchone() return set(ids) finally: if cursor: cursor.close() if connection: connection.close()
Офлайн
MaLSreturn {item[0] for item in cursor}
return (item[0] for item in cursor)
MaLSНедавно понадобилась MySQL, поставил pymysql. Он довольно удобный.
На Windows использую Python 3.4.2 (x86) и MySql Connector 2.0.3.
>>> import pymysql >>> >>> con = pymysql.connect(host='localhost', user='guest') >>> cur = con.cursor() >>> cur.execute('use test') 0 >>> cur.execute('show tables') 2 >>> list(cur) [('p',), ('t',)] >>> con.close() >>>
MaLS
Мне из базы нужно получить массив интов, где то 44000 штуки.
Офлайн
py.user.nextВо втором варианте читаются быстро, так что проблема не в MySql сервере.
Вот открой консоль просто и вручную подключись к базе данных. Посмотри, сколько времени они выбираются. Потом - сколько времени они читаются.
py.user.nextРаботать с большими массивами данных пробовал?
Недавно понадобилась MySQL, поставил pymysql.
Офлайн
MaLS
Работать с большими массивами данных пробовал?
>>> import pymysql >>> >>> con = pymysql.connect(host='localhost', user='guest', db='test', charset='utf8') >>> cur = con.cursor() >>> cur.execute('select * from cond') 17184 >>>
MaLSЭто не для проверки сервера, а для проверки модуля MySql Connector 2.0.3.
Во втором варианте читаются быстро, так что проблема не в MySql сервере.
Офлайн
py.user.nextХорошая идея.
А в первом варианте что проиходит, когда вручную подключаешься?
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> import mysql.connector as connector >>> connection = connector.connect(host="*****", database="*****", password="*****", user="*****") >>> cursor = connection.cursor() >>> cursor.execute("SELECT series_id FROM series WHERE status <> 'X'") >>> rows = {r[0] for r in cursor} Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> rows = {r[0] for r in cursor} File "<pyshell#4>", line 1, in <setcomp> rows = {r[0] for r in cursor} File "C:\Program Files (x86)\Python\lib\site-packages\mysql\connector\cursor.py", line 809, in fetchone row, self.description) File "C:\Program Files (x86)\Python\lib\site-packages\mysql\connector\conversion.py", line 394, in row_to_python result[i] = self._cache_field_types[field_type](row[i], field) File "C:\Program Files (x86)\Python\lib\site-packages\mysql\connector\conversion.py", line 421, in _INT_to_python return int(value) ValueError: invalid literal for int() with base 10: b'8783402\n\x00\x00\x00' >>>
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> import mysql.connector as connector >>> connection = connector.connect(host="*****", database="*****", password="*****", user="*****") >>> cursor = connection.cursor() >>> cursor.execute("SELECT series_id FROM series WHERE status <> 'X' LIMIT 1000") >>> rows = {r[0] for r in cursor} >>> len(rows) 1000
Отредактировано MaLS (Фев. 20, 2015 11:20:05)
Офлайн
MaLSЭто их косяк. Ошибка в модуле. Они должны стрипать нули.ValueError: invalid literal for int() with base 10: b'8783402\n\x00\x00\x00'
>>> int(b'1\x00', 10) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: b'1\x00' >>> int(b'\x00', 10) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: b'\x00' >>> int(b'1\n', 10) 1 >>>
MaLSЭто не из-за количества, а просто доходит до записи, которая с нулями приходит.
Соответственно, если ставим ограничение, то всё работает:
Отредактировано py.user.next (Фев. 20, 2015 13:20:08)
Офлайн
ставьте mysqlclient - форк MySQldb для python 3, быстрее чем pymysql
Офлайн
sanderЧто-то там исходники какие-то не такие. По сравнению с pymysql выглядит так, будто какой-то студент форкнул, тогда как в pymysql всё профессионально сделано.
ставьте mysqlclient - форк MySQldb
Офлайн