powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / не получается вставить строку в БД FB из Python
53 сообщений из 53, показаны все 3 страниц
не получается вставить строку в БД FB из Python
    #38590571
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Инструменты: win7 64, python 3.3.4 x86, Excel 2010, Firebird 2.5.2 x64, fdb 1.4
Общая задача: открыть файл Excel и записать из него данные в БД FB. Особенности - файл из офиса 2003 (7 листов по 65000 элементов, итого примерно 450 000 элементов)

код

Код: 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.
46.
47.
48.
49.
50.
51.
# coding: utf-8
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:\\pgn.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) 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,10):
                if str(Sheet.Cells(y,1)) != 'None':
                    # Sheet.Cells(y,1) - ФИО в латинской транскрипции
                    # Sheet.Cells(y,2) - ФИО на русском
                    # Sheet.Cells(y,3) - дата чего-то . Пока не интересно
                    dt1=str(Sheet.Cells(y,3))
                    dt1=dt1[0:19]
                    dt1=str(dt1[8:10])+'.'+str(dt1[5:7])+'.'+str(dt1[0:4])+' '+str(dt1[11:])
                    print(type(Sheet.Cells(y,2)))
                    rus_name=str(Sheet.Cells(y,2))
                    print(type(rus_name))
                    print('-------\n','orig=',rus_name)
                    fb_cur.execute(sql_prep,[Sheet.Cells(y,1),rus_name.encode('utf-8'),dt1])
        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()



при выполнении из cmd.exe дает такую ошибку
('Error while executing SQL statement:\n- SQLCODE: -413\n- conversion error from string “КАСАТКИНА АЛЕНА”\n- conversion error from string “КАСАТКИНА АЛЕНА”\n- conversion error from string “КАСАТКИНА АЛЕНА”', -413, 335544334)
и при изменении запроса на явное приведение к типу
r"INSERT INTO gpk_input (lat_name,name,to_date) VALUES (?,CAST(? AS VARCHAR(50)),?)"
- эта же ошибка

Такая же ошибка (с другим текстом в кавычках) при инсерте чисто латинской строки, т.е получается вопрос не в кодировке кирилицы (сперва про нее думал)

Помогите плз идеями. Может трабл с ДЛЛ ФБ - на сервере 2003 86, у меня на хосте 7*64
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38590585
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160rus_name.encode('utf-8')
не вижу, что указан чарсет коннекта.
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38590592
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего попутаны параметры и строка пытается вставиться в дату. Включай трассировку
на сервере и смотри куда приходят какие значения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38590657
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как минимум - kdv прав - не указан чарсет коннекта, соответственно fdb коннектится с чарсетом none. Кроме того, я бы смотрел вывод запроса вместе с параметрами непосредственно перед fb_cur.execute.

И отдельно - не работал третьим пайтоном, но вроде как кастовать к UTF-8 в нем уже не надо. Или еще надо?
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38590686
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переделал:
1.
Код: python
1.
fb_conn = fdb.connect(dsn='firebird:d:\\pogran.FDB',user='sysdba',password='masterkey',sql_dialect=3,charset='WIN1251')


2.
Код: python
1.
sql_prep=fb_cur.prep(r"INSERT INTO gpk_input (lat_name) VALUES (?)")


3.
Код: python
1.
fb_cur.execute(sql_prep,[Sheet.Cells(y,1)])



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

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

в ошибке вроде явно указано conversion error from string “КАСАТКИНА АЛЕНА”
т.е "на глаз" строка входит верная. Но что-то не так
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38590706
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160установил рекомендуемые параметры в коннект.А кто рекомендовал ставить win1251 ?
В любом случае - проверить utf8 гораздо быстрее, чем писать на форум...
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38590707
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160"на глаз" строка входит верная
А ты абсолютно уверен, что она входит туда, куда ты думаешь?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38590712
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не работает даже в простом виде
Код: python
1.
fb_cur.execute(sql_prep,["AAA BBB"])


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

база создана в кодировке вин1251, поэтому ее и указал в коннекте
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38590719
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160база создана в кодировке вин1251, поэтому ее и указал в коннектеВ коннекте нужно указывать кодировку, в которой работает клиент.
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38590723
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сменил коннект на УТФ

Код: python
1.
fb_conn = fdb.connect(dsn='firebird:d:\\pogran.FDB',user='sysdba',password='masterkey',sql_dialect=3,charset='UTF8')



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

1 нет, не уверен на 100. как и во всем прочем, что касается ИТ
2 как проверить ?
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38590769
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160,

Ну а метаданные для целевой таблицы привести можешь? Может там не varchar(), а что-то другое затесалось?
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38590781
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMaster,

CREATE TABLE GPK_INPUT (
ID BIGINT NOT NULL,
LAT_NAME VARCHAR(50),
NAME VARCHAR(50),
TO_DATE TIMESTAMP,
SEX SMALLINT,
SEX_NAME CHAR(7),
C_PASP_TYPE SMALLINT,
PASP_TYPE_NAME VARCHAR(40),
PASP_NUM VARCHAR(20),
IDENTIF VARCHAR(20),
REG_DATE TIMESTAMP,
C_DIRECTION SMALLINT,
DIRECTION_NAME CHAR(5),
C_COUNTRY SMALLINT,
COUNTRY_NAME VARCHAR(100),
INS_DT TIMESTAMP DEFAULT CURRENT_TIMESTAMP(3)
);
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38590792
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160,

А что будет, если просто выполнить: fb_cur.execute("INSERT INTO table(NAME) VALUE ('АННА')")? Т.е. без всяких параметров, а тупо скормить текст запроса.
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38590944
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s6791601 нет, не уверен на 100. как и во всем прочем, что касается ИТ
2 как проверить ?
1. Это правильно.
2. Как уже сказал: включить трассировку и посмотреть что точно приходит на сервер.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38591007
s679160
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

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

заремил sql_prep=fb_cur.prep - чтобы исключить ранний препар
выполнение fb_cur.execute("INSERT INTO gpk_input(NAME) VALUES ('asdv')")

ошибка та же. капец
SQLCODE: -413 conversion error from string "asdv"
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38591024
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160п.2 не понял о чем. Значит не знаю пока
RTFM %FIREBIRD%/doc/README.trace_services.txt
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38591028
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160,

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

триггер?

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

tracelog

2014-03-19T16:59:24.7350 (664:01F5D19C) TRACE_INIT
SESSION_1 my_trace

2014-03-19T16:59:24.7350 (664:01F5D19C) ATTACH_DATABASE
D:\pgr.FDB (ATT_255, SYSDBA:NONE, ASCII, TCPv4:10.*.*.*)
D:\Python v3.3\python.exe:5552

2014-03-19T16:59:34.6240 (664:01F5D19C) START_TRANSACTION
D:\pgr.FDB (ATT_255, SYSDBA:NONE, ASCII, TCPv4:10.*.*.*)
D:\Python v3.3\python.exe:5552
(TRA_1210, READ_COMMITTED | REC_VERSION | WAIT | READ_WRITE)

2014-03-19T16:59:34.6400 (664:01F5D19C) PREPARE_STATEMENT
D:\pgr.FDB (ATT_255, SYSDBA:NONE, ASCII, TCPv4:10.*.*.*)
D:\Python v3.3\python.exe:5552
(TRA_1210, READ_COMMITTED | REC_VERSION | WAIT | READ_WRITE)

Statement 38:
-------------------------------------------------------------------------------
INSERT INTO gpk_input(NAME) VALUES ('asdv')
6 ms

2014-03-19T16:59:34.6400 (664:01F5D19C) EXECUTE_STATEMENT_START
D:\pgr.FDB (ATT_255, SYSDBA:NONE, ASCII, TCPv4:10.*.*.*)
D:\Python v3.3\python.exe:5552
(TRA_1210, READ_COMMITTED | REC_VERSION | WAIT | READ_WRITE)

Statement 38:

-------------------------------------------------------------------------------

INSERT INTO gpk_input(NAME) VALUES ('asdv')

2014-03-19T16:59:34.6400 (664:01F5D19C) EXECUTE_TRIGGER_START
D:\pgr.FDB (ATT_255, SYSDBA:NONE, ASCII, TCPv4:10.*.*.*)
D:\Python v3.3\python.exe:5552
(TRA_1210, READ_COMMITTED | REC_VERSION | WAIT | READ_WRITE)

GPK_INPUT_BI FOR GPK_INPUT (BEFORE INSERT)

2014-03-19T16:59:34.6400 (664:01F5D19C) ERROR AT jrd8_execute
D:\pgr.FDB (ATT_255, SYSDBA:NONE, ASCII, TCPv4:10.*.*.*)
D:\Python v3.3\python.exe:5552

335544334 : conversion error from string "asdv"
335544334 : conversion error from string "asdv"

2014-03-19T16:59:34.6560 (664:01F5D19C) ROLLBACK_TRANSACTION
D:\pgr.FDB (ATT_255, SYSDBA:NONE, ASCII, TCPv4:10.*.*.*)
D:\Python v3.3\python.exe:5552
(TRA_1210, READ_COMMITTED | REC_VERSION | WAIT | READ_WRITE)
7 ms, 6 write(s), 1 fetch(es), 1 mark(s)

2014-03-19T16:59:34.6560 (664:01F5D19C) FREE_STATEMENT
D:\pgr.FDB (ATT_255, SYSDBA:NONE, ASCII, TCPv4:10.*.*.*)
D:\Python v3.3\python.exe:5552

Statement 38:

-------------------------------------------------------------------------------

INSERT INTO gpk_input(NAME) VALUES ('asdv')

2014-03-19T16:59:34.6560 (664:01F5D19C) DETACH_DATABASE
D:\pgr.FDB (ATT_255, SYSDBA:NONE, ASCII, TCPv4:10.*.*.*)
D:\Python v3.3\python.exe:5552

2014-03-19T16:59:34.6560 (664:01F5D19C) TRACE_FINI
SESSION_1 my_trace
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38591083
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s679160tracelog
Из которого следуют две вещи:
1) Нихрена ты не поменял кодировку подключения.
2) Ошибка в триггере GPK_INPUT_BI.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
не получается вставить строку в БД 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
не получается вставить строку в БД FB из Python
    #38597257
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sheet.UsedRange .Value - выдает кортеж. Без взятия Value Питон идет по IEnumVariant похоже.
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38597280
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот не поленился:
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
>>> from win32com.client import Dispatch
>>> ex = Dispatch('Excel.Application')
>>> wb = ex.Workbooks.Add()
>>> sheet = wb.sheets(1)
>>> sheet.Name
'Лист1'
>>> for n in range(1,10000): sheet.Cells(n,1).Value = n + 22

>>> st1 = lambda: max(c for c in sheet.Range('A1:A5000').Value)
>>> st1()
(5022.0,)
>>> st2 = lambda: max(c.Value for c in sheet.Range('A1:A5000'))
>>> from timeit import timeit
>>> timeit(st1, number=2)
0.03986819553881848
>>> timeit(st2, number=2)
26.37115275824162
>>> st2()
5022.0


Разница между Range vs Range.Value довольно отчетлива...
...
Рейтинг: 0 / 0
не получается вставить строку в БД FB из Python
    #38597290
stelvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да разница офигенная.
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / не получается вставить строку в БД FB из Python
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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