Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / не получается вставить строку в БД FB из Python / 25 сообщений из 53, страница 1 из 3
19.03.2014, 13:47:04
    #38590571
s679160
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается вставить строку в БД FB из Python
Инструменты: 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
19.03.2014, 13:55:04
    #38590585
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается вставить строку в БД FB из Python
s679160rus_name.encode('utf-8')
не вижу, что указан чарсет коннекта.
...
Рейтинг: 0 / 0
19.03.2014, 13:58:04
    #38590592
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается вставить строку в БД FB из Python
Скорее всего попутаны параметры и строка пытается вставиться в дату. Включай трассировку
на сервере и смотри куда приходят какие значения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.03.2014, 14:35:27
    #38590657
miwaonline
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается вставить строку в БД FB из Python
Как минимум - kdv прав - не указан чарсет коннекта, соответственно fdb коннектится с чарсетом none. Кроме того, я бы смотрел вывод запроса вместе с параметрами непосредственно перед fb_cur.execute.

И отдельно - не работал третьим пайтоном, но вроде как кастовать к UTF-8 в нем уже не надо. Или еще надо?
...
Рейтинг: 0 / 0
19.03.2014, 14:51:28
    #38590686
s679160
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается вставить строку в БД FB из Python
Переделал:
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
19.03.2014, 14:53:51
    #38590689
s679160
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается вставить строку в БД FB из Python
miwaonline,

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

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


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

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

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



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

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

Ну а метаданные для целевой таблицы привести можешь? Может там не varchar(), а что-то другое затесалось?
...
Рейтинг: 0 / 0
19.03.2014, 15:37:41
    #38590781
s679160
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается вставить строку в БД FB из Python
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
19.03.2014, 15:44:36
    #38590792
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается вставить строку в БД FB из Python
s679160,

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

п.2 не понял о чем. Значит не знаю пока
...
Рейтинг: 0 / 0
19.03.2014, 17:29:23
    #38591022
s679160
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается вставить строку в БД FB из Python
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
19.03.2014, 17:31:27
    #38591024
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается вставить строку в БД FB из Python
s679160п.2 не понял о чем. Значит не знаю пока
RTFM %FIREBIRD%/doc/README.trace_services.txt
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.03.2014, 17:36:03
    #38591028
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается вставить строку в БД FB из Python
s679160,

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

триггер?

единственный, на поле ID
...
Рейтинг: 0 / 0
19.03.2014, 18:09:53
    #38591071
s679160
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается вставить строку в БД FB из Python
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
19.03.2014, 18:25:17
    #38591083
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не получается вставить строку в БД FB из Python
s679160tracelog
Из которого следуют две вещи:
1) Нихрена ты не поменял кодировку подключения.
2) Ошибка в триггере GPK_INPUT_BI.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / не получается вставить строку в БД FB из Python / 25 сообщений из 53, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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