Яркие отношения с двоичными UUID в соединении sqlsrv (`PDO :: DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER`) - PullRequest
0 голосов
/ 20 июня 2020

Я буквально часами искал, как это исправить, поэтому я просто спрошу здесь, если кто-то уже решил эту проблему или у него есть хорошие предложения. Вся информация, доступная в Интернете (которую я могу найти, я буквально просмотрел весь inte rnet уже более суток), кажется неактуальной, потому что она устарела (для версий php ниже 7.4) или потому что предложения просто не сработали, или потому, что эти люди также отказались от попытки сделать то же самое.

Одно из приложений, над которыми я сейчас работаю, требует чтения из sqlsrv соединения для чтения некоторых данных и импорта его в другую базу данных.

Текущая проблема, с которой я столкнулся раньше, была связана с используемыми UUID. Они хранились в двоичном формате, и без установки каких-либо дополнительных параметров для подключений к базе данных Eloquent Relationship не работали. (Eloquent пытается запросить двоичный файл giberi sh, и это приводит к ошибкам в синтаксисе SQL). После того, как я установил следующую конфигурацию, для подключения к базе данных все казалось приятным, и все работает:

'driver' => env('AMERICAN_DB_DRIVER', 'sqlsrv'),
'url' => env('AMERICAN_DATABASE_URL'),
'host' => env('AMERICAN_DB_HOST', 'localhost'),
'port' => env('AMERICAN_DB_PORT', '1433'),
'database' => env('AMERICAN_DB_DATABASE', 'forge'),
'username' => env('AMERICAN_DB_USERNAME', 'forge'),
'password' => env('AMERICAN_DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'options' => [
    // Get the UUID's in a normal string format
    PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER => true,
],

Проблема

Когда Теперь я пытаюсь запустить задание gitlab, которое устанавливает зависимости проекта в конвейере Gitlab на образе edbizarro/gitlab-ci-pipeline-php:7.4 docker, я получаю следующую ошибку, когда задание выполняется php artisan key:generate:

$ php artisan key:generate

In database.php line 79:
                                                                
  Undefined class constant 'DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER'  

Вы можете просмотреть соответствующую часть .gitlab-ci здесь:

stages:
  - preparation

image: edbizarro/gitlab-ci-pipeline-php:7.4

variables:
  ACCEPT_EULA: "Y"
  SA_PASSWORD: yourStrong(!)Password
cache:
  key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"

composer:
  before_script:
    # Add sqlsrv dependencies
    - curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
    - sudo sh -c 'curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list'
    - sudo apt-get update && sudo env ACCEPT_EULA=Y apt-get install -y msodbcsql17 unixodbc-dev
    # Install our needed dependencies
    - sudo -E pecl install sqlsrv pdo_sqlsrv

    # xdebug is already included in the docker image
    - sudo -E docker-php-ext-enable sqlsrv pdo_sqlsrv

  stage: preparation
  script:
    - php -v
    - php -m
    - composer install --prefer-dist --no-ansi --no-interaction --no-progress --no-scripts
    - cp .env.example .env
    - php artisan key:generate
  artifacts:
    paths:
      - vendor/
      - .env
    expire_in: 1 days
    when: always
  cache:
    paths:
      - vendor/

Когда я сравниваю модули локально с изображением docker, я вижу, что следующие расширения были установлены локально, но не внутри контейнер docker: odbc, pdo_dblib, PDO_ODBC. Однако я не могу установить пакет pdo_odb c из-за проблем с правами доступа. Я пробовал этот вопрос о переполнении стека , который ссылается на эту проблему github .

Но в итоге я получаю:

$ docker-php-source extract; \ { \ echo '# https://github.com/docker-library/php/issues/103#issuecomment-271413933'; \ echo 'AC_DEFUN([PHP_ALWAYS_SHARED],[])dnl'; \ echo; \ cat /usr/src/php/ext/odbc/config.m4; \ } > temp.m4; \ mv temp.m4 /usr/src/php/ext/odbc/config.m4; \ apk add --no-cache unixodbc-dev; \ docker-php-ext-configure odbc --with-unixODBC=shared,/usr; \ docker-php-ext-install odbc; \ docker-php-source delete
mkdir: cannot create directory '/usr/src/php': Permission denied

Короче говоря, уже есть кто-то, у кого есть следующие рабочие (и может предоставить некоторые указатели):

  • Запуск приложения php с Eloquent в образе docker на основе php7 .4
  • Использование соединения с драйвером sqlsrv для базы данных
  • Имеет UUID в двоичном формате для первичных ключей (я не могу это изменить, так как исходная база данных находится в этом формате)
  • Использует отношения на основе этих UUID.

Заранее спасибо.

...