Ubuntu 18.04 + VsCode + Python3 + pyodbc(odbc-postgresql) から Posgtgres12 にアクセスしてみる


目的

・Ubuntu 18.04 に odbc-postgresql をインストールする
・同じく pyodbc をインストールする
Ubuntu 18.04 + VsCode + Pytho3 + psycopg2(libpq-dev) から Posgtgres12 にアクセスしてみる
で作成した環境にアクセスしてみる
※Ubuntu はファイルが分割の粒度が小さいから、ファイル探すのにコツがいる感じ

pyodbcをインストールする


$ sudo pip3 install pyodbc
~
Installing collected packages: pyodbc
Successfully installed pyodbc-4.0.30

odbc-postgresqlをインストールする

対象パッケージを検索してみる


$ sudo apt search post | grep odbc
~
golang-github-lpabon-godbc-dev/bionic,bionic 1.0+git20140613.1.9577782-1 all
libcppdb-odbc0/bionic 0.3.1+dfsg-6 amd64
  SQL Connectivity Library (odbc backend)
libghc-hdbc-odbc-dev/bionic 2.3.1.1-8build3 amd64
libghc-hdbc-odbc-doc/bionic,bionic 2.3.1.1-8build3 all
libghc-hdbc-odbc-prof/bionic 2.3.1.1-8build3 amd64
odbc-postgresql/bionic-pgdg 1:12.02.0000-1.pgdg18.04+1 amd64
odbc-postgresql-dbgsym/bionic-pgdg 1:12.02.0000-1.pgdg18.04+1 amd64
  debug symbols for odbc-postgresql
r-cran-rodbc/bionic 1.3-15-1build1 amd64

Connect to PostgreSQL from Linux or Mac with ODBCより


$ sudo apt install odbc-postgresql
~
以下のパッケージが新たにインストールされます:
  odbc-postgresql
~  
odbc-postgresql:amd64 (1:12.02.0000-1.pgdg18.04+1) を展開しています...
odbc-postgresql:amd64 (1:12.02.0000-1.pgdg18.04+1) を設定しています ...
odbcinst: Driver installed. Usage count increased to 1. 
    Target directory is /etc
odbcinst: Driver installed. Usage count increased to 1. 
    Target directory is /etc

$ sudo ls /etc/*odbc*
/etc/odbc.ini  /etc/odbcinst.ini

$ sudo odbcinst -i -d -f /etc/odbc.ini
実行後 /etc/odbc.ini の内容 -> /etc/odbcinst.ini (?仕様をチェックしないと・・)

$ sudo odbcinst -i -d -f /etc/odbcinst.ini
を実行すると /etc/odbcinst.ini の内容がクリアされる(仕様なのか??)

$ sudo cat /etc/odbcinst.ini
~
[PostgreSQL ANSI]
Description=PostgreSQL ODBC driver (ANSI version)
Driver=psqlodbca.so
Setup=libodbcpsqlS.so
Debug=0
CommLog=1
UsageCount=1

[PostgreSQL Unicode]
Description=PostgreSQL ODBC driver (Unicode version)
Driver=psqlodbcw.so
Setup=libodbcpsqlS.so
Debug=0
CommLog=1
UsageCount=1

/etc/odbc.ini の編集

ODBCドライバのインストール先は


$ sudo find /usr/lib -name psqlodbcw.so
/usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so

$ sudo find /usr/lib -name libodbcpsqlS.so
現在は見えない・・
※/usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so

odbcinst1debian2_2.3.4-1.1ubuntu3_amd64.deb
には /usr/lib/x86_64-linux-gnu/odbc/libodbcpsqlS.so が記載されているのだが、インストールされていないのは謎??
※20.04 ではインストールされているので 様子見・・

/etc/odbc.ini に上記を追加後修正する


$ sudo cat /etc/odbc.ini
~
[PostgreSQL ANSI]
Description=PostgreSQL ODBC driver (ANSI version)
Driver=/usr/lib/x86_64-linux-gnu/odbc/psqlodbca.so
Setup=libodbcpsqlS.so
Debug=0
CommLog=1
UsageCount=1

[PostgreSQL Unicode]
Description=PostgreSQL ODBC driver (Unicode version)
Driver=/usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
Setup=libodbcpsqlS.so
Debug=0
CommLog=1
UsageCount=1

odbc ドライバの有効化


$ sudo odbcinst -i -d -f /etc/odbc.ini
odbcinst: Driver installed. Usage count increased to 1.
    Target directory is /etc
odbcinst: Driver installed. Usage count increased to 1.
    Target directory is /etc
odbcinst: Driver installed. Usage count increased to 1.
    Target directory is /etc
###odbc ドライバのリストの表示
$ sudo odbcinst -q -d
[MSSQLDEMO]
[PostgreSQL ANSI]
[PostgreSQL Unicode]

###odbc ドライバのリストの無効化
$ sudo odbcinst -u -d -n MSSQLDEMO
$ sudo odbcinst -u -d -n 'PostgreSQL ANSI'
$ sudo odbcinst -u -d -n 'PostgreSQL Unicode'

Code RunnerでPython3をキックする場合の修正点

修正になったバージョンが不明なのだけど 1.46.1 の時点では以下の手順で修正する
・ファイル -> 基本設定 -> 設定
・検索ボックスに Code-runner:Executor Map を入力する


・setting.json で編集をクリックする
 ・修正前
    "code-runner.executorMap": {
    }
 ・修正後
    "code-runner.executorMap": {
        "python": "python3 -u"
    }

サンプルコード

# Windows Add env PYTHONIOENCODING = UTF-8 & restart vscode
# coding:utf-8

import pyodbc

server   = '192.168.5.49'
port = '5432' 
database = 'demo' 
username = 'demo' 
password = 'passwd' 
constr = 'DRIVER={PostgreSQL Unicode};SERVER=' + server + ';PORT=' + port + ';DATABASE=' + database + ';UID=' + username + ';PWD=' + password
conn = pyodbc.connect(constr)
# Create a cursor from the connection
cur = conn.cursor()

cur.execute("select count(*) from zipcode")
row = cur.fetchone()
if row:
    print(row)

cur.close()
conn.close()

参考にしたサイトはこちら

PostgreSQL データ ソースに接続する (SQL Server インポートおよびエクスポート ウィザード)
Ubuntu 18.04 で SQL Server2019 Express を試してみる
Ubuntu 18.04 + VsCode + Pytho3 + psycopg2(libpq-dev) から Posgtgres12 にアクセスしてみる
必要ライブラリがありません事案の救世主apt-file
Ubuntu 20.04 に Posgtgres をインストール後 C# + Npgsql でアクセスしてみる
Win10 + VsCode + Python3 + psycopg2 から Ubuntu 20.04 + Posgtgres12 にアクセスしてみる