데이터베이스에 연결하기 위해 pyodbc를 사용하는 응용 프로그램이 있습니다. 다른 db 엔진으로 실행할 수 있습니다. 이제 저는 그것을 Firebird에 적용하려고합니다. 내가 바인딩 parametres 처리하기 위해 기본 pyodbc 방법을 사용할 수 있습니다 (SQLite는 테스트, 사이베이스) 일부 DB 엔진파이어 버드에 연결하여 pyodbc를 사용하는 바인딩 매개 변수
:
cnxn = pyodbc.connect(connect_string, autocommit=True)
cur = cnxn.cursor()
sql = """DECLARE v_file_type_id INT; v_path varchar2(1024); v_md5 varchar2(32);
BEGIN
v_file_type_id := %d;
v_path := '%s';
v_md5 := '%s';
insert into files (file_type_id, path, md5) values (v_file_type_id, v_path, v_md5);
END;""" % (file_type_id, path, md5)
cur.execute(sql)
: Oracle의
cnxn = pyodbc.connect(connect_string, autocommit=True)
cur = cnxn.cursor()
cur.execute("insert into files (file_type_id, path, md5) values (?, ?, ?)", file_type_id, path, md5)
나는 실행하는 특별한 SQL을 준비했다
첫 번째 방법은 Firebird에서 작동하지 않습니다. 오류 : pyodbc.IntegrityError: ('23000', '[23000] [ODBC Firebird Driver][Firebird]validation error for column FILE_TYPE_ID, value "*** null ***" (-625) (SQLExecDirectW)')
가 표시됩니다.
오라클과 마찬가지로 전용 SQL을 준비하려고했지만 몇 가지 문제가 있습니다.
cnxn = pyodbc.connect(connect_string, autocommit=True)
cur = cnxn.cursor()
sql = """set term^;
execute block
as
declare v_file_type_id int = %d;
declare v_path varchar(1024) = '%s';
declare v_md5 varchar(32) = '%s';
begin
insert into files (file_type_id, path, md5) values (:v_file_type_id, :v_path, :v_md5);
end
^
set term ; ^""" % (file_type_id, path, md5)
cur.execute(sql)
작동하지 않습니다. 이번 오류는 pyodbc.Error: ('HY000', '[HY000] [ODBC Firebird Driver][Firebird]Dynamic SQL Error\nSQL error code = -104\nToken unknown - line 1, column 5\nterm (-104) (SQLExecDirectW)')
입니다.
나는 어떤 해결책을 찾고있어, 그 두 가지 방법 중 하나로 그것을 실행할 수 있습니다. 성능 측면 또한 매우 중요합니다. 응용 프로그램이 자주 실행되지는 않지만 코드의 일부분이 약 15 만 개를 삽입 할 때마다 files
테이블에 삽입됩니다.
파이어 버드가 실행하려고하는 실제 SQL을 보면 여기서 도움이 될 것입니다. SQL과 매개 변수를 전달할 때'pyodbc'에서 실행되는 실제 SQL을 볼 수있는 방법이 없습니다. Firebird에서 쿼리 로깅을 설정하고 오류의 원인이되는 SQL을 포함시킬 수 있습니까? – FlipperPA