powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / не получается вставить строку в БД FB из Python
25 сообщений из 53, страница 2 из 3
не получается вставить строку в БД FB из Python
    #38591100
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

1 сейчас коннект в режиме ASCII. ПРобовал 'UTF8' и 'WIN1251'
2 триггер и генератор удалил
3 тип поля ID сделал обычным Integer

однофигственно
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38591116
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Капец. Дурка какая-то.
Удалил индексы - заработало
Вернул триггер и генератор - работает
Вернул тип ИД в бигинт - работает.
Из коннекта убрал чарсет и диалект - работает
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38591133
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160
Код: python
1.
fdb.connect(dsn='firebird:d:\\pgn.FDB'


s6791602014-03-19T16:59:24.7350 (664:01F5D19C) ATTACH_DATABASE
D:\pgr.FDBТак pg n или pr g ?
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38591640
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё господа, благодарствую кто отозвался! ЗажилО
Каким-то боком мешали индексы. Удалил их и всё шпиливили

Рабочий вариант - без чарсета в коннекте, без диалекта, без декодирования строк и выковыривания дат. Не во всем "кошерно", но фунциклирует

Код: python
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.
# coding: cp1251
from win32com.client import Dispatch
import pythoncom
import datetime
import sys
import fdb

#=========================================================
def main(argv=None):
    start_time=datetime.datetime.now()
    print(start_time)

    fb_conn = fdb.connect(dsn='firebird:d:\\pgr.FDB',user='user',password='password')
    trans=fb_conn.trans()
    trans.begin
    fb_cur=trans.cursor()
    sql_prep=fb_cur.prep(r"INSERT INTO gpk_input (lat_name,name,to_date,sex,sex_name,c_pasp_type,pasp_type_name,pasp_num,identif,reg_date,c_direction,direction_name,c_country,country_name) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)")    
    
    xlApp = Dispatch("Excel.Application")
    xlApp.Visible=False
    xlWb = xlApp.Workbooks.Open(r"D:\Documents\children.xls")

    try:
        for Sheet in xlWb.WorkSheets:
            print("Sheet=",Sheet.Name," ",datetime.datetime.now())
            for y in range(2,65002):
                if str(Sheet.Cells(y,1)) != 'None':
                    fb_cur.execute(sql_prep,[str(Sheet.Cells(y,1)),str(Sheet.Cells(y,2)),str(Sheet.Cells(y,3))[0:19],int(Sheet.Cells(y,4)),str(Sheet.Cells(y,5)),int(Sheet.Cells(y,6)),str(Sheet.Cells(y,7)),str(Sheet.Cells(y,8)),str(Sheet.Cells(y,9)),str(Sheet.Cells(y,10))[0:19],int(Sheet.Cells(y,11)),str(Sheet.Cells(y,12)),int(Sheet.Cells(y,13)),str(Sheet.Cells(y,14))])
        trans.commit()
        fb_cur.close()        
        trans.close()
    except Exception as e3:
        print("main try:","Line "+format(sys.exc_info()[-1].tb_lineno),e3.__str__())
        print("Sheet='",Sheet.Name,"' y=",y)        
        trans.rollback()
        fb_cur.close()
        trans.close()
        
    xlApp.Quit()        
    fin_time=datetime.datetime.now()
    print(fin_time," | ",fin_time-start_time)

#==========================================        
if __name__ == "__main__":
    main()



448 162 записи обрабатывало 04:04:32, скорость ~30,5 зап/сек
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38591820
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160448 162 записи обрабатывало 04:04:32, скорость ~30,5 зап/сек
А чего так медленно?
Насколько часто возникает такая задача?
Если раз в месяц/квартал то заливка из CSV может быть сильно шустре. Это при условии, что тормозит не в FB (триггеры/железо...).
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38591840
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgmА чего так медленно?
Это же питон. Читающий из экселя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38591893
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160Рабочий вариант - без чарсета в коннекте
это нерабочий вариант.
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38591922
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovafgmА чего так медленно?
Это же питон. Читающий из экселя.
Ну я подозреваю что проблема именно в чтении из экселя, потому как вставка питоном работает нормально.
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38592053
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

я ж грю - рабочий. но не во всем красивый
изменены имена БД, исходного файла и аккаунта юзера
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38592057
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

поскольку сразу не получилось работать с ФБ, то пробовал из екселя в csv тем же питоном. время то же - 3,5..4 часа в зависимости от нагрузки на ПК
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38592068
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
afgms679160448 162 записи обрабатывало 04:04:32, скорость ~30,5 зап/сек
А чего так медленно?
Насколько часто возникает такая задача?
Если раз в месяц/квартал то заливка из CSV может быть сильно шустре. Это при условии, что тормозит не в FB (триггеры/железо...).

задача не реалтайм, будет работать раз в 3-6 мес. железо = обычный "писюк". триггер - единственный для работы генератора. имхо ботлнек в данном случае = эксель, ибо переписывание этих же данных из екселя в csv занимает примерно столько же времени. Технологичность самой затеи лучше не обсуждать ))
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38593964
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s679160ботлнек в данном случае = эксельМожно выкинуть его, и читать из файла не используя сервер автоматизации.
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38593973
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160,

я вот тоже подумал, ведь можно вызвать метод экселя, сохраняющий данные в csv, и уже так их обработать.
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38594290
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

Можно и так. Бедт время - попробую.
Но как обычно есть "бубен".

1. Многолистовой файл (xls) можно сохранить только отдельными файлами листам (CSV).
2. MS насколько я знаю в этой операции не позволяет принудительно установить символ-разделитель; по дефолту это запятая, а не точка-с-запятой, как у нормального софта

Можно еще пересохранить в книгу 2010, со всех листов перенести данные на первый и потом уже попробовать работу именно с книгой 2010 и с CSV

Всё равно придется что-то писАть, дабы компенсировать корявость.
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38594320
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s6791602. MS насколько я знаю в этой операции не позволяет принудительно установить символ-разделитель; по дефолту это запятая, а не точка-с-запятой, как у нормального софта

У тебя Питон, а у него формат экселя указать можно при парсинге csv.
С одной стороны стоит разделить задачи: извлекать данные в csv одним модулем, а загружать - другим. С другой стороны вряд ли будет заметный выигрыш в производительности от этого.
А вот работу с листом надо бы переделать: во-первых, у экселя можно получить рабочую область листа, и не проходить все строки. Во-вторых, получение экселевского range в виде массива намного быстрее обращения к отдельным ячейкам.
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38594328
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman IgnatievВо-вторых, получение экселевского range в виде массива намного быстрее обращения к отдельным ячейкам. Я бы сказал на порядок быстрее ...
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38595793
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
   try:
        for Sheet in xlWb.WorkSheets:
            print("Sheet=",Sheet.Name," ",datetime.datetime.now())
            for y in range(2,65002):
                if str(Sheet.Cells(y,1)) != 'None':                
                    arr= [str(c) for c in Sheet.Range(Sheet.Cells(y, 1), Sheet.Cells(y,14))]
                    fb_cur.execute(sql_prep,[arr[0],arr[1],arr[2][0:19],int(float(arr[3])),arr[4],int(float(arr[5])),arr[6],arr[7],arr[8],arr[9][0:19],int(float(arr[10])),arr[11],int(float(arr[12])),arr[13]])
        trans.commit()        
        fb_cur.close()        
        trans.close()
    except Exception as e3:
        print("main try:","Line "+format(sys.exc_info()[-1].tb_lineno),e3.__str__())
        print("Sheet='",Sheet.Name,"' y=",y)        
        trans.rollback()
        fb_cur.close()
        trans.close()



в таком виде разбор одного листа занимает не 40 мин, а 28. Не на порядок, но порядочно, -30% :)
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38596002
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160,
Код: python
1.
for y in range(2,65002):


Это построчно? Разговор был о том, чтобы весь лист загнать в массив, а потом в цикле залить в базу...
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38596005
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ты одну строку взял.
Вообще говоря, должно быть Sheet.Range(Sheet.Cells(y, 1), Sheet.Cells(y,14)) .Value , вроде бы это возвращает кортеж строки.
Как я уже говорил, есть свойство UsedRange, которое возвращает использованный диапазон. Не хочешь - просто бери через range весь лист и бегай по кортежам вложенными циклами, памяти завались сейчас.
Кажется, Sheet.Range(Sheet.Cells(2, 1), Sheet.Cells(65002,14)).Value даст тебе что нужно.
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38596013
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160for y in range(2,65002)
а окончание диапазона никак нельзя в листе узнать, "до цикла"? Зачем шерстить 65к строк, если в листе может быть всего 100 строк?
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38596065
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

Согласен, "жесткий" цикл есть некрасиво.
Но на фоне таких данных ИМХо не играет глобальной роли.
Лист1...Лист6 = 65 000
Лист7 = 58 000

Я ж грю - исходный файл из офиса 2003, где гораздо большие ограничения на количество строк. А логически это всё составляет одну БД
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38596148
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvs679160for y in range(2,65002)
а окончание диапазона никак нельзя в листе узнать, "до цикла"? Зачем шерстить 65к строк, если в листе может быть всего 100 строк?

Можно. Это метод экселя. В данном случае должно быть что-то типа Sheet.UsedRange.Rows.Count
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38596178
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stelvic,
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
try:
        for Sheet in xlWb.WorkSheets:
            print("Sheet=",Sheet.Name," ",datetime.datetime.now())
            arr= [str(c) for c in Sheet.Range(Sheet.Cells(2, 1), Sheet.Cells(65000,14))]
            print(1,datetime.datetime.now())
            fb_cur.execute(sql_prep,[arr[0],arr[1],arr[2][0:19],int(float(arr[3])),arr[4],int(float(arr[5])),arr[6],arr[7],arr[8],arr[9][0:19],int(float(arr[10])),arr[11],int(float(arr[12])),arr[13]])
        trans.commit()        
        fb_cur.close()        
        trans.close()



Эффект есть, но не глобальный. Строка arr= [str(c) for c in Sheet.Range(Sheet.Cells(2, 1), Sheet.Cells(65000,14))] выполняется 18 мин для каждого листа.
Реально не для Екселя такие работы
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38596650
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160Эффект есть, но не глобальный. Строка arr= [str(c) for c in Sheet.Range(Sheet.Cells(2, 1), Sheet.Cells(65000,14))] выполняется 18 мин для каждого листа.
Реально не для Екселя такие работы

Это ответ скорее Dnico , чем мне. Я же посоветовал как ограничить диапазон строк. Впрочем, если ты уверен, что на листе всегда используется 65000 строк этот совет тоже не сильно поможет.
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38597166
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160Эффект есть, но не глобальный. Строка arr= [str(c) for c in Sheet.Range(Sheet.Cells(2, 1), Sheet.Cells(65000,14))] выполняется 18 мин для каждого листа.
Реально не для Екселя такие работы

И вдогонку. Ты этой строчкой мало, что изменил. Замерь время выполнения вот этой сточки:
Код: python
1.
arr = Sheet.Cells


а еще лучше этой:
Код: python
1.
arr = Sheet.UsedRange
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 2 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / не получается вставить строку в БД FB из Python
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]