質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

767閲覧

python実行サーバーからSQL Server搭載サーバーへデータを格納する方法

O-KoA

総合スコア3

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/01/13 00:51

前提

pyhtonを実行するサーバーとSQL Serverを搭載しているサーバーは別に設置しています。この2つはともにWindows Server 2016です。
python実行サーバー ⇒ Aサーバー
SQL Server搭載サーバー ⇒ Bサーバー

該当のソースコード

Aサーバーのpythonプログラムから、BサーバーにあるSQL Serverのテーブルにデータを格納するコードを書いています。

以下はpythonプログラム(SQLACCESS.py)のコードです。

import pyodbc import pandas as pd import settings import pymssql import csv from sqlalchemy import create_engine # インスタンス instance = "インスタンス名" # ユーザー user = "ユーザー名" # パスワード pasword = "パスワード" # ポート port = "ポート番号" #データベース database = "データベース名" #CSVファイルパス file = "C:\\Users\\***\\***\\***\\access_test.csv" #テーブル名 table = "テーブル名" # DB接続 connection = ( 'DRIVER={SQL Server};SERVER='+instance + ';DATABASE='+database+';UID='+user+';PWD='+ pasword + ';' ) con = pyodbc.connect(connection, autocommit=True) cursor = con.cursor() #CSVを読み込み、データフレーム化 csv = pd.read_csv(file, encoding='utf-8-sig') df = pd.DataFrame(csv) #テーブルに格納されているデータを全て削除 cursor.execute("TRUNCATE TABLE " + table) con.commit() #データフレームのままSQLServerに格納する engine = create_engine(f"mssql+pymssql://{user}:{pasword}@{instance}/{database}") df.to_sql('Access_test', con = engine, if_exists='replace', index=None) con.commit() # DB切断 cursor.close() con.close()

発生している問題・エラーメッセージ

以下のエラーが表示され、データ格納できませんでした。
接続情報に間違いはございません。

エラーメッセージ Traceback (most recent call last): File "c:\Users\***\***\***\SQLACCESS.py", line 38, in <module> con = pyodbc.connect(connection, autocommit=True) pyodbc.OperationalError: ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server が存在しないか、アクセスが拒否されました。 (17) (SQLDriverConnect); [08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect()). (53)')

質問

pyhton実行サーバー(Aサーバー)のpythonプログラムから、SQL Server搭載サーバー(Bサーバー)にあるSQL Serverのテーブルにデータを格納するためにはどうしたらよいでしょうか。一方、pythonプログラムをクライアントPCから実行すると、格納できることは確認しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/01/13 01:24

> 一方、pythonプログラムをクライアントPCから実行すると、格納できることは確認しています。 「クライアントPC」って何ですか? 「Aサーバー」「Bサーバー」とどういう関係にあるのですか?
melian

2023/01/13 01:27

connection = ( 'DRIVER={SQL Server};SERVER='+instance + ';DATABASE='+database+';UID='+user+';PWD='+ pasword + ';' ) コネクションの部分ですが、ポート番号が指定されていません。DB サーバがデフォルトのポート番号を使用しているのであれば問題ないのですが、それ以外の番号を使用しているということはありませんか?
退会済みユーザー

退会済みユーザー

2023/01/13 01:31

SQL Server のバージョン・エディションは何ですか? Express 版をデフォルトでインストールしたとかじゃないでしょうね?
dameo

2023/01/13 03:11

接続に失敗しています。53だと恐らく https://learn.microsoft.com/ja-jp/windows/win32/debug/system-error-codes--0-499- ERROR_BAD_NETPATH 53 (0x35) ネットワーク パスが見つかりませんでした。 だと思います。ODBCの接続文字列だとserver=は ホスト名\インスタンス名 のような形でないといけないかもしれません(ポートないし)。 接続文字列の調べ方については、以下も参考になるかもしれません。 https://learn.microsoft.com/ja-jp/sql/integration-services/import-export-data/connect-to-an-odbc-data-source-sql-server-import-and-export-wizard?view=sql-server-ver16
O-KoA

2023/01/19 07:38 編集

みなさま コメントありがとうございます。 コメントいただきました内容を元に検証を進めております。検証結果がわかり次第、ご報告させていただきます。 また、ご質問いただきました内容の回答は、下記の通りです。 >「クライアントPC」って何ですか? 「Aサーバー」「Bサーバー」とどういう関係にあるのですか? 「クライアントPC」とは「Aサーバー」の代わりとして使用したパソコン(Windows 10 Pro)のことです。「クライアントPC」からpythonプログラムを実行すると「Bサーバー」へのデータ格納は成功しましたが、「Aサーバー」からpythonプログラムを実行すると「Bサーバー」へのデータ格納は失敗しました。 >SQL Server のバージョン・エディションは何ですか? 「Bサーバー」にインストールしたSQL Server のバージョン・エディションは、下記の通りです。 バージョン:13.0.5888.11 エディション:Microsoft SQL Server Standard (64-bit)
退会済みユーザー

退会済みユーザー

2023/01/19 07:35 編集

エラーメッセージから「Aサーバー」の Python アプリが「Bサーバー」の SQL Server に (1) 接続できない、もしくは (2) ログインできない ・・・ということになると思うのですが。「クライアントPC」の Python アプリの接続文字列は「Aサーバー」の Python アプリと同じで、SQL Server の認証の問題はない(=ログインできないということはない)ということですか?
O-KoA

2023/01/19 08:19

ご質問に回答いたします。 >「クライアントPC」の Python アプリの接続文字列は「Aサーバー」の Python アプリと同じで、SQL Server の認証の問題はない(=ログインできないということはない)ということですか? ご記載のとおりでございます。
退会済みユーザー

退会済みユーザー

2023/01/19 09:03

とすると、「Aサーバー」が「Bサーバー」と同じ LAN 内に無いとか、接続文字列 SERVER='+instance + ' ... の instance で名前解決ができないということが思い浮かびますが、そういうことはないのでしょうか?
guest

回答2

0

自己解決

ご回答いただいた方法で確認作業を進めておりましたが、
pingコマンドでAサーバーとBサーバー間の通信を確認(通信できませんでした。)し、ネットワーク担当者に伺ったところ、AサーバーとBサーバー(ともにAzure VM)は別のネットワーク上にいることが判明いたしました。
ネットワーク担当者と今後の対応方法を検討することとなりましたので、いったんクローズとさせていただきます。
皆様、ご回答ありがとうございました。また、基本的な部分の確認不足があり大変申し訳ございませんでした。

投稿2023/01/27 02:38

O-KoA

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

あくまで問題解決への指針としての情報提供のみの回答です。
SQL Server への接続を確立している間に、ネットワーク関連またはインスタンス固有のエラーが発生しましたの流れで確認していくとよいかもしれません。
とくに後半のネットワーク関連でしょうか。

投稿2023/01/13 01:25

can110

総合スコア38264

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

O-KoA

2023/01/19 06:44

回答ありがとうございます。 コメントいただきました内容を元に検証を進めております。検証結果がわかり次第、ご報告させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問