Integrate Snowflake with Laravel

Snowflake is a cloud-based data warehousing service that offers high performance, scalability, and flexibility for managing large volumes of data. Using the offical pdo driver, PHP applications can directly interact with Snowflake, enabling seamless execution of queries and retrieval of data.

In order to integrate Snowflake with our Laravel application using PostgreSQL we’re going to use the laravel-pdo-odbc package and the pdo_snowflake PHP PDO driver from snowflake.
At the end of the post I leave a script with all the steps to build and install the driver in a Dockerfile.

NOTE: Snowflake PHP PDO driver does not yet support ARM/AARCH64 architecture on Linux.

PHP PDO Driver

First we have to build and install the pdo driver.

Prerequisites

To build the Snowflake PHP PDO Driver, we need to have installed the following software:

On Linux:

  • PHP 8.1 or higher (Note: support for PHP 8.0 or lower is deprecated).
  • gcc 5.2 or higher.
  • cmake 2.8 or higher.

And the following php modules:

  • php-pdo.
  • pdo_pgsql.
  • pdo_odbc.

Building the Driver

  • Set the PHP_HOME environment variable to the path to the bin directory containing the phpize executable. For example, if the phpize executable is in /usr/local/bin, run the following command:
export PHP_HOME=/usr/local
  • Clone the pdo_snowflake repository, and run the script to build the driver:
git clone https://github.com/snowflakedb/pdo_snowflake.git
cd pdo_snowflake
./scripts/build_pdo_snowflake.sh

To verify that the driver was succesfully built, run the next command:

$PHP_HOME/bin/php -dextension=modules/pdo_snowflake.so -m | grep pdo_snowflake

It should appear pdo_snowflake in the output from the command.

Installing the Driver

  • Copy pdo_snowflake.so from the modules subdirectory in the repository to the PHP extension directory.
cp modules/pdo_snowflake.so /usr/local/lib/php/extensions/no-debug-non-zts-*/
  • Copy cacert.pem from the libsnowflakeclient subdirectory in the repository to the PHP configuration directory containing the PHP configuration files. To find the PHP configuration directory, you can use this command $PHP_HOME/bin/php -ini.
cp ./libsnowflakeclient/cacert.pem /usr/local/etc/php/cacert.pem
  • In the same directory that contains the PHP configuration files, create a config file named pdo_snowflake.ini that contains the following settings:
extension=pdo_snowflake.so
pdo_snowflake.cacert=<path to PHP config directory>/cacert.pem
  • If you are using PHP with an application server or web server (e.g. Apache or nginx), restart the server.

Integrating the PHP Driver in Laravel

Once we have the driver set up we need to install the package to make the integration with laravel.

  • To add the package to your project, run the following command:
composer require yoramdelangen/laravel-pdo-odbc
  • Register the service provider in the app file from you project:
// app.php

'providers' => [
  // ...
  LaravelPdoOdbc\ODBCServiceProvider::class,
];
  • Add a Database configuration into the database file:
// database.php

'snowflake' => [
    'driver' => 'snowflake_native',
    'account' => '{account_name}.eu-west-1',
    'username' => '{username}',
    'password' => '{password}',
    'database' => '{database}',
    'warehouse' => '{warehouse}',
    'schema' => 'PUBLIC', // change it if necessary.
    'options' => [
        // Required for Snowflake usage
        \PDO::ODBC_ATTR_USE_CURSOR_LIBRARY => \PDO::ODBC_SQL_USE_DRIVER
    ]
],
  • Finish! Now you can use Eloquent ORM, and other Illuminate components as usual.
// Facade
$users = DB::connection('snowflake')
            ->table('users')
            ->where('created_at', '>', '2024-03-15')
            ->get();

// ORM
$users = User::all();

To know more about the PHP pdo driver and the laravel package, you can check the documentation here:

PHP PDO drive: https://github.com/snowflakedb/pdo_snowflake
Laravel package: https://github.com/appsfortableau/laravel-pdo-odbc

Dockerfile

If you use Docker in your local environment, here is a script to add into your dockerfile with all the steps to download and install the php pdo driver.

NOTE: If you are using Docker on an ARM architecture, you can force it to a x86 architecture adding platform linux/x86_64 on the docker-compose.yml file in the container that you are installing the driver.

# Dockerfile

# Install system dependencies
RUN apt-get update && apt-get install -y \
    cmake \
    && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \
    && apt-get clean && rm -rf /var/lib/apt/lists/* \
    && docker-php-ext-configure pdo_odbc --with-pdo-odbc=unixODBC,/usr \
    && docker-php-ext-install \
    pdo \
    pdo_pgsql \
    pdo_odbc \

    ENV PHP_HOME /usr/local

    # Pull the Snowflake PDO repo and install the driver
    RUN mkdir /tmp/pdo_snowflake && \
        git clone https://github.com/snowflakedb/pdo_snowflake.git /tmp/pdo_snowflake
    RUN cd /tmp/pdo_snowflake && \
        bash ./scripts/build_pdo_snowflake.sh && \
        cp modules/pdo_snowflake.so /usr/local/lib/php/extensions/no-debug-non-zts-*/ && \
        cp ./libsnowflakeclient/cacert.pem /usr/local/etc/php/cacert.pem
    RUN echo "extension=pdo_snowflake.so" > /usr/local/etc/php/conf.d/pdo_snowflake.ini && \
        echo "pdo_snowflake.cacert=/usr/local/etc/php/cacert.pem" >> /usr/local/etc/php/conf.d/pdo_snowflake.ini

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.