MySQL 3.23을 pyodbc 3.07과 연결
UnixODBC 및 pyodbc 3.07을 사용하는 Ubuntu 16 클라이언트에서 오래된 MySQL 3.23 서버에 연결하려고 합니다.MySQL Connector/ODBC 버전 3개와 Maria 버전 2개를 사용해 보았습니다.DB:
MySQL-ODBC 5.3.9 새로운 mysql 인증 방식만 지원합니다.따라서 접속할 수 없습니다.
MySQL-ODBC 5.1.13 인증방식용 스위치가 있는데, 이 스위치가pyodbc.connect(dsn)
:[MySQL][ODBC 5.1 Driver]Driver does not support server versions under 4.1.1
MySQL-ODBC 3.51에는 다음 두 가지 문제가 있습니다.
- 에 실패하다
[MySQL][ODBC 3.51 Driver]Transactions are not enabled (4000) (SQLSetConnnectAttr(SQL_ATTR_AUTOCOMMIT))
pyodbc는 autocommit을 기본값으로 false로 설정합니다. - 에 접속할 때 접속할 수 있습니다.
pyodbc.connect(dsn, autocommit=True)
. 연결 시 커서가 표시되지만 모든 커서가 표시됩니다.execute(sql) 예외 발생('HY000', 'The driver did not supply an error!')
.
셸에서 isql을 사용한 접속 테스트isql -v [dsn]
세션을 제공하지만 모든 스테이트먼트에 실패합니다.[ISQL]ERROR: Could not SQLExecute
이것은 unixodbc의 문제인 것 같습니다.
mysql-client를 설치했습니다.단, programmysql은 서버 접속에 실패합니다.
mariadb-client는 데이터베이스에 접속하여 문을 실행할 수도 있습니다.그게 더 유망해 보여요.
MariaDB ODBC-Driver 3.0.2를 다운로드했습니다.이 드라이버를 isql과 함께 사용하면 다음 오류가 반환됩니다.[S1000][unixODBC][ma-3.0.2]Plugin old_password could not be loaded: lib/mariadb/plugin/old_password.so: cannot open shared object file: No such file or directory
그것은 함께 일할 수 있는 응답이다.ODBC-Option PLUGIN_DIR이 있지만 플러그인 위치를 알 수 없습니다.
MariaDB ODBC-Driver 2.0.13은('HY000', "[HY000] [unixODBC][ma-2.0.13]You have an error in your SQL syntax near 'SQL_AUTO_IS_NULL=0' at line 1 (1064) (SQLDriverConnect)")
온커넥트이것을 바꿀 수 있는 방법이 없을 것 같아서.막다른 길이에요.
unixodbc/pyodbc를 통해 이 오래된 MySql에 액세스할 수 있는 방법이 있는지 알고 싶습니다.
아니면 MariaDB용 플러그인 old_password.so를 어디서 구할 수 있는지 아는 사람이 있나요?
apt-get을 통해 설치된 mariadb-client는 연결할 수 있으므로 방법이 있을 것입니다.
하루 정도 이 문제를 검토했지만 드라이버 코드를 대폭 수정하지 않으면 불가능하거나 이전 버전의 빌드 환경을 만들기 매우 어렵다고 생각합니다.
제가 했던 것과 같은 토끼굴에 다른 사람이 빠지지 않도록(더 좋은 것은, 다른 사람이 제가 중단한 곳에서 문제를 해결할 수 있도록!) 대답에 넣었습니다.댓글에 맞지 않았습니다.
이건 좀 귀찮을 거야, 미안해.
개요
Ubuntu 16.04 컨테이너 쌍, Oracle에서 제공되는 MySQL 3.23 다운로드, 그리고 당신이 언급한 모든 클라이언트 libs를 사용하여 당신의 투고에서 언급된 오류 조건(완전하고 훌륭한 질문 감사합니다!)을 재현할 수 있었습니다.
아래는 당신이 언급한 각 장소에서 추가 해결책을 찾다가 발견한 것입니다. 그리고 몇 가지 "다음 단계" 유형의 정보와 이야기의 교훈에 대해 개론합니다.
이 모든 테스트는 최신 버전의 Python 2, UnixODBC 및pyodbc
(경유)pip
)는 2017년 26월 11일 현재 재고 Ubuntu 16.04 도커 컨테이너에 사용할 수 있습니다.
사용된 URL은 모두 링크되어 있지만, 이 소프트웨어의 대부분이 20년 이상 된 것을 고려하면 역사가 시사하는 바가 있다면 시간이 지남에 따라 사라질 수 있습니다.또, 원한다면, 제 셸 스크립트/도커 파일/수정된 드라이버 소스를 투고할 수 있습니다.댓글에 PING만 해주세요.
old_password.so 및 MariaDB 커넥터/ODBC 3.0.2
이것이 가장 가능성이 높은 문제 해결 옵션이라는 것은 당신이 옳았습니다.제가 한 일은 다음과 같습니다.
먼저 Connector/ODBC 3.0.2 바이너리를 설치하고 Python을 통해 연결을 시도했습니다.ODBC 설정 후 발생한 오류와 동일한 오류입니다..ini
파일 이름 "files"를 지정합니다.즉, 다음과 같습니다.
> pyodbc.connect('DRIVER={maria};Server=mysql;Database=mysql;User=admin;Password=admin')
pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Plugin old_password could not be loaded: lib/mariadb/plugin/old_password.so: cannot open shared object file: No such file or directory (2059) (SQLDriverConnect)')
ODBC 코드는 충분히 오래된 인증 프로토콜을 알리는 MySQL 서버와 함께 제공되는 경우 Connector/C MariaDB 드라이버용으로 작성된 컴파일된 플러그인을 로드하려고 시도합니다. strace
ODBC 접속 시행의 출력에 의해 이것이 결정되었습니다.
old_password.so
는, Connector/C MariaDB 드라이버의 컴포넌트인 것을 알 수 있습니다만, 그 드라이버의 바이너리 릴리스에 포함되어 있는 라이브러리는 아닙니다.재밌는.
다음과 같은 플러그인 모듈이 많이 있는 것으로 나타났습니다.old_password
커넥터/C 드라이버의 소스에 포함되어 있습니다.Connector/C 3.0.2 소스를 다운로드하여 다음과 같이 배포된 "auth" 유형의 플러그인용 문서, 소스 및 빌드 시스템을 열었습니다..so
뭘 찾을 수 있는지 보려고요
Connector/C의 다양한 컴포넌트는 메인 드라이버 라이브러리에 "정적으로" 링크된 플러그인 또는 동적 라이브러리 자체로서 컴파일할 수 있습니다.C 드라이버의 빌드 프로세스에서는 양쪽 모두 스태틱(static)이 생성되기 때문에 따옴표로 "static"이라고 합니다..a
다이나믹( ).so
) 버전mariadbclient
단, 빌드 시스템에서 특정 플러그인이 스태틱으로 선언된 경우 해당 플러그인의 코드는 양쪽 모두에 스태틱하게 포함됩니다.mariadbclient
아티팩트
의 소스old_password.so
파일이 1개의 작은 소스 파일에 있는 것처럼 보입니다.plugins/auth/old_password.c
.
빌드 시스템(CMake)을 변경하여 CMAKE의 동적 라이브러리를 생성할 수 있을 것으로 생각됩니다.old_password
플러그 인.커넥터/C 소스에는cmake/plugins.cmake
모든 플러그인의 "메시지" 역할을 하는 파일입니다.cmake 매크로가 포함되어 있습니다.REGISTER_PLUGIN
이 방법에는STATIC
또는DYNAMIC
논쟁.나는 그 파일을 검색했다old_password
다음 행을 찾았습니다.
REGISTER_PLUGIN("AUTH_OLDPASSWORD" "${CC_SOURCE_DIR}/plugins/auth/old_password.c" "old_password_client_plugin" "STATIC" "" 0)
그것은 유망해 보였다.생산한 유사한 라인의 모델화.so
플러그인의 파일 행을 다음과 같이 변경하고 빌드를 실행했습니다.
REGISTER_PLUGIN("AUTH_OLDPASSWORD" "${CC_SOURCE_DIR}/plugins/auth/old_password.c" "old_password_client_plugin" "DYNAMIC" "old_password" 1)
종속성이 누락되어 빌드가 여러 번 실패했습니다.몇 개 설치했습니다.-dev
패키지와 기타 툴은 깔끔하게 구축할 수 있었습니다(플러그인만 해도 CURL이나 OpenSSL은 필요없었습니다).아니나 다를까,mysql_old_password.so
에서 작성되었습니다.plugins/auth
빌드 아티팩트로서의 디렉토리.- 플러그인을 찾기 위해 Python 코드가 필요했습니다.그 때문에, 아직 찾을 수 없는 에러가 발생하고 있습니다.lib/mariadb/plugin/old_password.so
제가 공급한 것은PLUGIN_DIR
ODBC 연결 문자열에 대한 질문에서 언급한 인수, 내 컴파일 이름 변경mysql_old_password.so
로.old_password.so
다음 코드를 실행하여 새로운 오류가 발생하였습니다.진행!
conn = pyodbc.connect('DRIVER={maria};Server=mysql;Database=mysql;User=admin;Password=admin;PLUGIN_DIR=/home/mysql/zclient/mdb-c/plugins/auth')
pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Plugin old_password could not be loaded: /home/mysql/zclient/mdb-c/plugins/auth/old_password.so: undefined symbol: ma_scramble_323 (2059) (SQLDriverConnect)')
컴파일된 아티팩트가 손상된 것 같습니다.ma_scramble_323
함수의 정의.플러그인은 런타임에 동적으로 로드되기 때문에 프로그램은 계속 시작되지만 다음 작업을 시도하면dload
플러그인이 터집니다.게다가 이 함수는 "구" MySQL 프로토콜 인증 메커니즘의 주요 암호 해싱 엔트리 포인트인 것처럼 보여 그냥 버릴 수 없었습니다.Connector/C 소스에서 해당 함수와 헤더에 대한 선언을 찾았습니다.mariadb_com.h
), 단,include
여러 곳에 그것을 주입하다old_password.c
소스 파일이 제대로 작동하지 않는 것 같습니다.내 예감은 이것이 두 가지 불행한 행동의 상호작용이라는 것이다.먼저 Connector/C 빌드 시스템에 의해 컴파일된 플러그인은 Connector/C 플러그인 또는 이와 유사한 플러그인에 의해서만 링크된다고 가정하여 셋업됩니다.이는 플러그인이 컴파일될 때 플러그인 자체가 "공통" 커넥터/C 기능에 링크되지 않는다는 것을 의미합니다.그것은 플러그인이 로딩되어 있는 것으로, 이러한 기능을 이미 사용할 수 있어야 하기 때문입니다.커넥터/C가 아닌 커넥터/ODBC를 사용하고 있기 때문에 이러한 공통 기능은 존재하지 않거나 액세스할 수 없습니다.소스에서 Connector/ODBC를 구축하려면 Connector/C가 필요합니다.따라서 새로운 Connector/ODBC 라이브러리를 컴파일하여 적절한 기능을 포함하도록 할 수 있을 것입니다만, 저는 이 토끼구멍을 열고 싶지 않았습니다.두 번째, 심지어 이 시스템을 구축하도록 지시받았을 때에도old_password
독립 실행형(다른 것은 컴파일하지 않음) 모드의 플러그인은 CMake 종속성 분석에서 다음을 설명하는 파일을 검색하거나 링크하지 않았습니다.ma_scramble_323
이는 CMake의 문제일 수 있지만 빌드 시스템이 위에서 설명한 사용 사례를 염두에 두고 구성되어 있지 않기 때문일 수 있습니다.
여기, 난 정말 운이 좋았어.그ma_scramble_323
함수는 에 정의되어 있습니다.libmariadb/ma_password.c
이는 매우 작고 단순한 소스 파일이며 Connector/C 프로젝트의 다른 라이브러리에는 크게 의존하지 않습니다.old_password
플러그 인.'가난한 남자의 링크'(우웩)를 하고 그냥 그 소스들을 베꼈어요ma_scramble_323
에 기능하다old_password.c
파일. 이러한 함수는 다른 함수로 불리며,ma_password.c
파일을 복사했습니다.다시 말씀드리지만, 이것은 매우 쉬웠습니다(또는 옵션입니다.ma_password.c
파일은 매우 단순했습니다.만약 그 자체에 의존관계가 있거나 더 복잡했다면, 나는 문제를 "올바른" 방법으로 해결하기 위해 고도의 CMake-fu를 멈추고, 떨어뜨리고, 익혀야 했을 것이다.나는 이것을 할 수 있는 더 좋은 방법이 있다고 절대적으로 확신한다.
(아사이드) 이 시점에서 저는 정기적으로 실행되어야만 했습니다.mysqladmin flush-hosts
테스트에 실패하는 경우가 너무 많아서 자주 이 작업을 수행해야 했습니다.아마 더 나은 방법이 있을 거야 하지만 난 그걸 모르고 크론도 알아
새로운 '인라인' 소스를 통해mysql_old_password.so
라이브러리를 컴파일하고 이름을 변경한 후 테스트 스크립트를 다시 실행했습니다.이번에는, 다음과 같이 했습니다.
pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Plugin old_password could not be loaded: name mismatch (2059) (SQLDriverConnect)')
ODBC가 파일을 찾을 수 있도록 파일 이름을 변경한 것과 관련이 있다고 생각했습니다(이 파일은old_password.so
것은 아니다.mysql_old_password.so
산탄총으로 접근해 봤습니다.에서plugins/auth/CMakeLists.txt
빌드 시스템 구성, 모든 인스턴스를 교체했습니다.mysql_old_password
와 함께old_password
컴파일 되었습니다.컴파일은 성공했지만 여전히 작동하지 않았습니다.
플러그인은 그 자체로 소스인 것이 판명되었습니다.old_password.c
이 경우)의 이름을 알리는 구조 선언이 상단에 있으며, 이 선언은 그 이름을 다음과 같이 알립니다.mysql_old_password
이것은 기존의 문제일 가능성이 있습니다(즉, 지금까지 성공한 적이 없습니다).그리고, 지금까지 아무도 구축하거나 테스트한 적이 없는 것 같은 코드를 작성하고 있는 경우는, 성공할 가능성이 높지 않습니다.어쨌든, 나는 똑같이 했다.s/mysql_old_password/old_password/
소스 파일에도 포함되며 컴파일됩니다.이번에는 다음과 같은 권한이 있는 아티팩트를 생성했습니다.old_password.so
테스트 스크립트를 다시 실행해 보니
conn = pyodbc.connect('DRIVER={maria};Server=mysql;Database=mysql;User=admin;Password=admin;PLUGIN_DIR=/home/mysql/zclient/mdb-c/plugins/auth')
pyodbc.Error: ('HY000', u"[HY000] [unixODBC][ma-3.0.2]Access denied for user: 'admin@hostname' (Using password: NO) (1045) (SQLDriverConnect)")
이거 이상했어.저는...mysql
클라이언트 테스트 박스에도 3.23 서버가 설치되어 있는 명령줄 클라이언트(시스템 라이브러리 경로가 아닌 tarball 경유)가 포함되어 있으며, 이러한 자격 증명으로 정상적으로 접속할 수 있습니다(테스트할 수 없었습니다).isql
제대로 쓸 수 없었기 때문에PLUGIN_DIR
플러그 인을 어디에 넣어야 하는지 알 수 없었습니다.시스템에 없습니다./usr
디렉토리 또는 관련 디렉토리)를 참조해당 디렉토리는 없습니다.나는 이것을 통해 방법을 찾을 수 없었다.MySQL 서버를 통상적인 "초단순, 테스트 전용"으로 셋업했습니다.GRANT
s, 대상localhost
그리고.%
모든 데이터베이스,admin
사용자 패스워드 및 eponymous 패스워드.
패스워드를 포기하고 empty/null로 설정해 패스워드 인증을 무효로 해, 로그인 할 수 있는 것을 확인했습니다.mysql
명령줄에서 한 번 더 시도합니다.
pyodbc.Error: ('HY000', u'[HY000] [unixODBC][ma-3.0.2]Error in server handshake (2012) (SQLDriverConnect)')
이것은 죽음의 종소리임이 판명되었다.이 오류를 조사하다가 GitHub 문제를 발견했습니다.이 문제는 기본적인 클라이언트/서버 프로토콜의 호환성을 나타내는 것으로 사람들이 꽤 확신하고 있는 것 같습니다.이 시점에서 나는 포기했다.old_password.so
접근.MariaDB 드라이버 코드 3.0.2 버전(C 또는 ODBC)은 MySQL 프로토콜의 오래된 사투리를 제대로 사용하지 못하는 것 같습니다. 그러나 이 과정에서 놓친 수정 사항이 많이 있을 수 있습니다.
다른 경로 시도
질문에서 언급하신 몇 가지 다른 사항을 시도해 보았습니다. 이 부분에 대해 간단히 설명하겠습니다.
찾으셨겠지만 디세블로 하려고 합니다.
SQL_AUTO_IS_NULL
MariaDB 2.0 ODBC 드라이버 패밀리의 동작이 제대로 작동하지 않습니다.이 버그 스레드 및 ODBC 커넥터 파라미터 목록에는 해당 필드의 설정을 디세블로 하는 방법에 대한 몇 가지 제안이 있습니다( ).Option=8388608
명백하고 명확하죠?) 하지만 플래그를 강제로 비활성화 또는 활성화하려고 해도 연결 문자열 또는 ODBC에 있는지 여부에 관계없이 동작은 변경되지 않습니다..ini
파일을 표시합니다.MySQL 아카이브 사이트에서 사용할 수 있는 이전 버전의 ODBC 커넥터가 있습니다.안타깝게도 컴파일된 버전은 모두 32비트 Linux용이지만 저는 가지고 있지 않습니다.소스로부터 구축해 보았습니다만, 툴 체인을 구성하는 것조차 매우 귀찮았습니다.1999년부터 시스템 식별 파일을 수동으로 설치해야 하는 시점에서는 분실 원인인 것을 알고 있었지만, 모든 Dep와 오래된 버전을 설치하고 컴파일을 시도했습니다.컴파일 에러의 수나 다양성에 의해서, 이 어프로치를 포기하게 되었습니다(C표준의 미스매치, 게다가 UnixODBC의 거의 모든 부분과의 호환성의 결여).C코더나 오래된 Linux 빌드 시스템 전문가가 아니기 때문에 이러한 문제에 대한 간단한 수정이 있을 수 있습니다.
서드파티제의 MySQL ODBC 커넥터를 시험해 봤지만 작동하지 않았습니다. 5.* 패밀리와 같은 오류입니다.
커넥터/ODBC 라이브러리의 2.50.39 버전을 컴파일했습니다(아카이브에서는 소스만 사용 가능).그러기 위해서, 저는 처음에
libmysqlclient.so.10
3.23 버전의 서버용 파일입니다.이를 위해서는 3.23 서버의 소스를 변경하여 다음 문제를 해결해야 합니다.errno
관련 문제(삭제)#define
에 대한 조항.extern int errno
에서my_sys.h
), libtool OS 정의 파일을 소스 디렉토리의 다양한 위치에 복사합니다(/usr/share/libtool/build-aux/config.{guess,sub}
에 복사되었습니다..
,mit-pthreads
,그리고.mit-pthreads/config/
(중요한 경우)그 후, 저는 컴파일 및 구축 작업을 할 수 있었습니다.libmysqlclient
의 라이브러리--with-mit-threads --without-server --without-docs --without-bench
스위치를 설정합니다.에 대한 매크로를 평가하는 동안 몇 가지 알 수 없는 오류가 발생하여 컴파일이 실패했습니다.mysql
그 후 클라이언트 프로그램, 하지만.so
에 대한 파일libmysqlclient
이미 생성되었기 때문에 저는 그것들을 잡고 넘어갔습니다.그 후libmysqlclient.so.10
라이브러리가 컴파일되어 아카이브에서 커넥터/ODBC의 2.50.39 버전을 구축했습니다.이를 위해서는 메인 MySQL에서 일부 소스를 변경해야 합니다(참조 파일 삭제).asm/atomic.h
시스템 식별 libtool 해킹을 다른 라이브러리와 동일하게 합니다.검출에 실패했습니다.iodbc
libs(Ubuntu에 설치)libiodbc2-dev
패키지)에 들어가 있기 때문에/usr/include
보다는/usr/local/include
마지막으로 스위치로 설정했습니다.--with-mysql-includes=$path_to_3.23_mysql_binary_dir/include --with-mysql-libs=$path_to_compiled_libmysqlclient.so.10_files_from_mysql_server_3.23_sources --with-iodbc-includes=/usr/include/iodbc
, 그리고 그것은 앞서 말한 것 외에는 문제없이 건설되었습니다.atomic.h
하지만, 그 후에 새로 컴파일한 파일을 통해libmyodbc.so
Python/UnixODBC에서 seg fault를 발생시켰습니다.발그린드gdb
, 및 기타 툴은 원인을 판별하는 데 도움이 되지 않습니다.컴파일된 라이브러리의 상호 운용성 문제를 디버깅하는 데 정통한 사람이 이 문제를 해결할 수 있을 것입니다.MySQL 아카이브에는 오래된 바이너리 RPM 버전의 Connector/ODBC가 있습니다.모두 32비트이며, 최신 Linux는 거의 모두 64비트입니다.이 파일들을 shimming하기 위해
i386
아키텍처와 필요한 라이브러리.64비트 Python/UnixODBC에서 로드하지 못했습니다.myodbc
플러그인이 정상적으로 실행되어 일반적인 "file not found" 오류가 반환됩니다.이 에러는 결국 콜에 실패한 것으로 거슬러 올라갑니다.dlopen
립툴스dlopen
(UnixODBC에 의해 사용되는) 래퍼(wrappers)는 대부분의 사람들에 의해 매우 디버깅이 불가능한 것으로 간주되고 있습니다.또한 상당한 번거로움을 겪은 후 저의 기본적인 Valgrind 트릭은 아키텍처 호환성이 없는 것을 동적으로 로드할 수 없는 것으로 생각되었습니다.i386
대x86-64
) ODBC 백엔드
솔루션/나머지
일반적으로 고객 측에서 코드를 다시 작성하는 것이 더 쉬울 것입니다.예를 들어 기존 Python 비ODBC MySQL 드라이버를 랩하는 Python 모듈을 만들 수 있습니다(@Flipper).PA는 질문에 대한 코멘트에서 제안되었으며, 해킹을 '충분히'pyodbc
이 모듈을 호출하는 코드를 너무 많이 리팩터링할 필요가 없는 모듈로 인터페이스하여 전개하기 전에 철저히 테스트합니다.짜증나고 위험하다는 건 알지만 그게 최선책일 거야이러한 모듈을 작성할 때는, 의 내부 코드의 일부를 사용할 수 있습니다.pyodbc
범용 ODBC 구문/et cetera 를 처리합니다.
가짜 ODBC 백엔드를 개발할 수도 있습니다.pyodbc
ODBC Python MySQL 이외의 드라이버를 호출했습니다만, 이것은 어려울 것 같습니다.pyodbc
님의 백엔드 플러그 기능은 주로 심 코드를 "확장"하는 것이 아니라 컴파일된 라이브러리를 대상으로 합니다.
저는 이 분야의 전문가가 아니기 때문에 놓치고 있는 솔루션이 있을지도 모릅니다.
그 밖에도 몇 가지 가능성을 고려했지만 포기했습니다.
MariaDB 사람들에게 버그를 제출하면 고칠 수 있을 거예요.결과적으로 발생한 프로토콜 오류가 "이것은 모든 수준에서 기본적으로 호환되지 않습니다."인지 아니면 "인증 시스템이 수정만 하면 모든 것이 작동합니다."인지 잘 모르겠습니다.시도해 볼 가치가 있을지도 몰라.
버전 2.50 커넥터/ODBC 코드의 32비트 RPM(64비트 Python/UnixODBC 환경에는 로드되지 않음)이 있으므로 전체 스택(또는 운영 체제 배포)을 32비트 코드로 변환할 수 있습니다.그러나 일반적이지 않은 컴파일 파일을 사용하는 경우 이는 상당한 문제가 될 수 있습니다.Ubuntu/Debian은 특히 오래된 아키텍처에서 패키지를 사용할 수 있도록 하는 데 매우 능숙하지만, 이는 여전히 까다로울 수 있습니다.모든 것을 변환해도 동작이 바뀔 수 있기 때문에, 32비트의 낡은 특성은, 당신의 앱으로 작업하고 있는 사람에게 있어서, 계속 이상한 것입니다.이것은 2.50 드라이버가 32비트 런타임에서 액세스 했을 때만 동작하는 경우이며, 그 후에 다른 문제가 발생할 수 있습니다.향후 클라이언트 코드의 유지 보수 부담이 매우 낮아질 가능성이 있는 경우(프로젝트가 작거나 변경될 가능성이 없는 경우)에만 이 방법을 사용하는 것이 좋습니다.
이야기의 도덕성
소프트웨어는 빠르게 썩는다.프로젝트가 하위 호환성을 유지하기 위해 지속적으로 작업하지 않는 한 특히 웹 소프트웨어에서 작업이 중단될 수 있습니다.
생성물 자체가 부서지는 것이 아니라 우주가 그 아래에서 수백만 가지 작은 방식으로 변하는 것입니다.누군가가 이러한 모든 작은 변화들과 그것들을 되돌릴 방법을 알 만큼 충분히 오래 있지 않는 한, 모든 것을 "그냥" 작동하는 곳으로 시간/개정하는 것은 매우 어렵다.
MySQL 드라이버와 같이 "일반적인" 바이너리일지라도 바이너리를 얻을 수 있습니다.인터넷과 공유하는 것이 이상적입니다.
필요한 의존관계/툴 체인 목록 전체를 엄격하게 문서화하여 인간을 위해 문서화합니다.예를 들어 자동 툴의 프로그램 의존성 목록을 읽는 데 필요한 도구 자체가 사용되지 않게 된다고 가정합니다.문서화할 만큼 명백한 것은 없습니다.아키텍처, 커널 ABI, libc 동작 등 아무것도 없습니다.이제 Docker와 같은 "모든 커널의 박스"에 있기 때문에 더 많은 의존관계를 프로그래밍 방식으로 저장할 수 있지만 기대하지는 마십시오.
Zac B가 보여준 것처럼 UnixODBC 및 pyodbc 3.07을 사용하는 Ubuntu 16 클라이언트에서 MySQL 3.23 서버를 연결하는 실질적인 방법은 없습니다.
FlipperPA는 가능한 한 다음 솔루션으로 pypi.python.org/pypi/MySQL-python/1.2.4을 사용할 것을 제안했습니다.그래서 시도해보았다.
apt를 통해 설치된 MySQL-python은 이전 MySQL에 연결할 수 없습니다.MySQL 3.23에서 동작하지 않는 시스템 mysql-client libs를 사용합니다.
pip을 통해 설치된 MySQL-python도 마찬가지입니다.libmysqlclient-dev 패키지에 포함된 mysql_config에서 libs를 가져옵니다.MySQL 3.23에서도 동작하지 않습니다.하지만 여기서 뭔가 수정할 수 있는 기회가 있어요.
libmariadb-client-lgpl-dev를 설치하면 mysql_config와 매우 유사한 mariadb_config가 나타납니다.또한 Ubuntu 16의 mariadb-client는 위와 같이 MySQL 3.23과 연동됩니다.
ln -s /usr/bin/mariadb_config mysql_config
pip install MySQL-python
이걸로 충분해.Python에서 오래된 MySQL Server를 연결할 수 있습니다.
데이터 타입에는 몇 가지 문제가 있지만, 저는 이 경우 까다롭지 않습니다.
언급URL : https://stackoverflow.com/questions/47350382/connect-mysql-3-23-with-pyodbc-3-07
'programing' 카테고리의 다른 글
16진수 색상 값(#fffff )을 정수 값으로 변환합니다. (0) | 2022.10.13 |
---|---|
Firebug 또는 유사한 도구를 사용하여 JavaScript/jQuery 이벤트 바인딩을 디버깅하는 방법 (0) | 2022.10.13 |
Android 앱을 프로그래밍 방식으로 종료하려면 어떻게 해야 합니까? (0) | 2022.10.13 |
Amazon EC2 - Maria에 원격으로 연결할 수 없음DB (0) | 2022.10.13 |
maria db 및 s3에 대한 클라우드 주조 공장 내 자동 백업 (0) | 2022.10.13 |