0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LinuxからODBC Driverを利用したMS SQLServerへの接続時のポート指定方法(pyodbc)

Posted at

概要

タイトルが長くなってしまいましたが、pyodbcでMS SQL Serverへ接続時のポート指定方法で詰まってしまったため、記録します。

環境

  • Linux
  • MS SQLServerのドライバはversion17
  • Python 3.11.4

結論

いきなり結論ですが、pyodbcの公式ドキュメントにある通り、デフォルト (1433) 以外のポートに接続する場合は、Serverの引数にコンマを付けて追加します。

例:

Server      = mydbserver.mycompany.com,49242

コードの例

詰まってしまったコードは下記です。
これはポートをPORTパラメータで指定していますが、ちゃんと動かずデフォルトのポート(1433)に接続されます。

この書き方はQiitaなどでは見かけたのですが、MSの公式ドキュメントでも見つけられませんでした。
もしかしたらドライバのバージョン18だと動くのかもしれませんが、検証できていません。ご存知の方がいましたらコメントいただければと思います。

ポートをパラメータで指定
import pyodbc

SERVER = '127.0.0.1'
PORT = '14334'
DATABASE = 'dbname'
USERNAME = 'username'
PASSWORD = 'password'

connectionString = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={SERVER};PORT={PORT};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'

try:
    # MS SQLServerに接続
    conn = pyodbc.connect(connectionString)
    print("Connection successful")
    
    # 接続したサーバー名を確認
    cursor = conn.cursor()
    cursor.execute("SELECT @@SERVERNAME AS ServerName;")
    row = cursor.fetchone()

    if row:
        print(f"Server Name: {row.ServerName}")

    cursor.close()
    conn.close()

except pyodbc.Error as ex:
    sqlstate = ex.args[1]
    print(f"Connection failed: {sqlstate}")

実行結果1

Connection successful
Server Name: Server1 #デフォルトのポートに接続

正しいコードは下記です。

ポートをServerのあとにカンマで指定
import pyodbc

SERVER = '127.0.0.1'
PORT = '14334'
DATABASE = 'dbname'
USERNAME = 'username'
PASSWORD = 'password'

-connectionString = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={SERVER};PORT={PORT};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'
+connectionString = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={SERVER},{PORT};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}'

try:
    # MS SQLServerに接続
    conn = pyodbc.connect(connectionString)
    print("Connection successful")
    
    # 接続したサーバー名を確認
    cursor = conn.cursor()
    cursor.execute("SELECT @@SERVERNAME AS ServerName;")
    row = cursor.fetchone()

    if row:
        print(f"Server Name: {row.ServerName}")

    cursor.close()
    conn.close()

except pyodbc.Error as ex:
    sqlstate = ex.args[1]
    print(f"Connection failed: {sqlstate}")

実行結果2

Connection successful
Server Name: Server2 #接続したいポートに接続できた

おまけ:MS SQL Serverドライバのバージョンの確認

MSSQLServerに接続したいときは、ドライバーのバージョンを確認しておいたほうが良いと思います。
odbcinstコマンドで確認できます。

$ odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/step/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

$ cat /etc/odbcinst.ini
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.2.1
UsageCount=1

バージョン17.4より前では動的ポートによる接続は動かない

ちなみに、下記のドキュメントによると、バージョン17.4より前では、動的ポートの接続はサポートされていないようなので注意してください。

静的ポートの名前付きインスタンスに接続するには、Server=servername,port_number を使用します。 バージョン 17.4 より前では、動的ポートへの接続はサポートされていません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?