2016-02-17 73 views
8

私はPythonでAS400と対話しようとしています。目標はSQLAlchemyを使用することですが、それが機能しなくなったら、ibm_db_saの代わりにibm_dbだけを使用して、より基本的なスクリプトに戻りました。データベース操作のためにIBM AS400サーバーに接続すると、

import ibm_db 
dbConnection = ibm_db.pconnect("DATABASE=myLibrary;HOSTNAME=1.2.3.4;PORT=8471;PROTOCOL=TCPIP;UID=username;PWD=password", "", "") #this line is where it hangs 
print ibm_db.conn_errormsg() 

問題は、ポートのようです。私がすべての例で見る50000を使用すると、エラーが発生します。 446を使用すると、エラーが発生します。困った部分はこれです:私が8471を使用した場合、IBM says to do、私はエラーもタイムアウトも何の応答も得られません。私はスクリプトを20分以上実行しておきました。何もせずにそこに座っています。私はコマンドプロンプトをまったく使用することができないので、これは有効ですが、いかなる種類のフィードバックも私に与えることはありません。

私は毎日、ロギング、メール送信、および(大量の)データベース使用のためにこの会社と同じ400を使用しています。私たちが使用しているソフトウェアは、舞台裏でデータベースと交信し、私のマシンでうまく動作します。それは私のドライバが良いこと、ネットワーク設定が正しいことなどを伝えます。私はここから400番までtelnetでつなぐこともできます。

私はSQLAlchemyとibm_dbの電子メールリストに載っていますが、この問題については数日間通信しています。私はまた、私は検索結果の未訪問のリンクが足りなくなってきているので、それをGoogle検索しました。接続の問題が無期限にぶら下がっているようには思えません。 Pythonで試すことができるものがあれば、試してみます。私は400を直接扱っていませんが、私が必要とするものをチェック/設定する人に尋ねることができます。私が言ったように、いくつかのワークステーションは問題なく400のデータベースと対話することができ、400から実行すると、うまく作業にアクセスしたいライブラリに対してクエリが実行されます。誰かが何か提案があれば、それを聞いていただければ幸いです。ありがとう!

+0

これについて進歩したことがあれば、ここでそれを共有すれば素晴らしいでしょう。私は、ibm_db_saのコードを突き止めて、何かが私のところに飛び出したかどうかを知りました。何かがありました: 'ibm_db_sa'の[' pyodbc.py'モジュール](https://github.com/ibmdb/python-ibmdbsa /blob/master/ibm_db_sa/ibm_db_sa/pyodbc.py)には 'AS400Dialect_pyodbc'というクラスがあり、' pyodbc_driver_name'には正しい値があります。 SQLAlchemyをDB2 for iで動かすには、明らかに少なくとも*いくつかの試みが行われました。 –

+0

私はしていません。さて、私のアプリは動いていますが、今はpyodbcだけに依存しています。私はpyodbcに接続してSAを使用しようとしましたが、create_engineへの接続を行う関数を渡しましたが、うまくいきませんでした。 – AH16

+0

SQLAlchemyの余分な機能を持たないとどれくらい傷つきますか?そして(a)Pythonを知っていて、(b)SQLAlchemyを知っていますか?私が尋ねる理由は、もう少し掘り出して突き詰めることによって、 'create_engine()'を使ってエンジンを正常に作成し、そのエンジンを使って裸のSQLクエリを実行することができたからです。言い換えれば、私はSQLAlchemyをPyODBC用の非常に畳み込まれたラッパーとして機能させることができます。私は自分の発見を分かち合うことができて嬉しいですが、私はORMを一度も使用していないので、SQLAlchemyを十分に活用する前に、さらに問題が潜んでいる可能性があります。 –

答えて

8

README for ibm_db_saには、「サポートされているデータベース」セクションのLinux/Unix/Windows用のDB2のみがリストされています。したがって、少なくともDB2 for iでは動作しない可能性があります。

IBM System i Access for Windowsを使用していると言われているので、付属のドライバ(ODBC、OLEDB、またはADO.NET)を使用することを強く推奨します。

個人的には、私は常にpyodbcまたはpypyodbcのいずれかを使用してODBCを使用します。どちらもうまくいく。簡単な例:

import pyodbc 

connection = pyodbc.connect(
    driver='{iSeries Access ODBC Driver}', 
    system='11.22.33.44', 
    uid='username', 
    pwd='password') 
c1 = connection.cursor() 

c1.execute('select * from qsys2.sysschemas') 
for row in c1: 
    print row 

さて、SQLAlchemyのの接続方法の一つがpyodbcあるので、私はあなたが直接pyodbcを使用して接続を確立することができれば、あなたが何らかの形で同じことを行うにはSQLAlchemyのを設定することができると思います。しかし、私はSQLAlchemyのユーザーではないので、そのためのサンプルコードはありません。

UPDATE

私はSQLAlchemyのが私たちのIBM iに接続し、ストレートSQLクエリを実行するために得ることができました。言い換えれば、単にPyODBCを直接使用するのとほぼ同じ機能にすることです。 他のSQLAlchemyの機能はテストしていません。あなたはこのためにpipを使用することができるかもしれ
SQLAlchemyの方言として

  • ibm_db_saをインストールしますが、私はそれをローテクな方法をした:私は私のWindows 7マシンに接続を設定するためにやった

    1. PyPIからibm_db_saをダウンロードしてください。
      この執筆時点では、最新バージョンは0.3.2で、2014-10-20にアップロードされています。それ以降のバージョンは、さまざまな方法で修正されたり壊れたりすることも考えられます(将来、私が記述しようとしている修正は不要であるか、動作しない可能性があります)。
    2. アーカイブを開梱して(ibm_db_sa-0.3.2.tar.gz)、同封のibm_db_saディレクトリをsqlalchemy\dialectsディレクトリにコピーします。
  • 変更sqlalchemy\dialects\ibm_db_sa\pyodbc.py

    • この点はAS400Dialect_pyodbcから継承DB2Dialectで同じ名前のメソッドをオーバーライドすることであるAS400Dialect_pyodbcクラス
      initialize()メソッドを追加します。問題はDB2Dialect.initialize()が属性dbms_verdbms_nameを設定しようとしていることです。どちらもPyODBCを使用してIBM iに接続するときには利用できません。
    • モジュールレベルの名前dialectを追加して、ファイルの最後に行くべき上記の修正のためのAS400Dialect_pyodbcクラス

コードに設定して、次のようになります。

def initialize(self, connection): 
     super(DB2Dialect, self).initialize(connection) 

dialect = AS400Dialect_pyodbc 

字下げに注意してください!initialize()メソッドはAS400Dialect_pyodbcクラスに属している必要があり、dialectはモジュールに対してグローバルである必要があることに注意してください。

最後に、あなたはエンジンの作成者に正しいURL与える必要があります。

'ibm_db_sa+pyodbc://username:[email protected]/*local'

を(もちろん、usernamepassword、およびhostの有効な値に置き換えてください。)

これだけです。この時点で、エンジンを作成し、iに接続し、SQLAlchemyを介してプレーンなSQLを実行できるようになります。私は、ORMのものの多くはこの時点で動作するはずだと思いますが、私はこれを確認していません。

+0

これはうまくいくようです!私は、クエリを実行し、obvciously、接続することができます! ibm_db/ibm_db_saが数日間失敗したのに対し、この資料にはibm_dbを使用すると非常に多くのことがあります。今、私はこれをsqlalchemyにフックする方法を考えなければなりません。助けてくれてありがとう。 @Charlesにも感謝します。最後のカップル日のあなたのすべての答えに感謝します。 – AH16

+0

私は同じ問題を抱えていますが、Linuxサーバーにしかアクセスできません。私はpyodbcがWindowsシステムでのみ動作すると仮定しています。あなたはLinuxのための解決策を知っていますか? – Jimmy

+1

@ジミー - 多分あなたは何か有用な[ここ](http://stackoverflow.com/questions/2960339/unable-to-install-pyodbc-on-linux)を見つけるでしょう。 –

1

どのポートが必要かを調べる方法は、IBM iのサービス・テーブル項目を調べることです。

あなたのIBM私は男そうのような画面を取得する必要がありますINAV GUIまたはサービス・テーブル・エントリ(WRKSRVTBLE)と緑のスクリーン作業コマンド

を使用することができます。

Service         Port Protocol 

as-admin-http       2001 tcp  
as-admin-http       2001 udp  
as-admin-https       2010 tcp  
as-admin-https       2010 udp  
as-central        8470 tcp  
as-central-s        9470 tcp  
as-database        8471 tcp  
as-database-s       9471 tcp 
drda          446 tcp 
drda          446 udp  

デフォルトポートをDB用確かに8471です。drdaは "distributed db"操作に使用されますが。

このthreadに基づいて、ibm_dbを使用してIBM i上のDB2に接続するには、IBM Connect製品が必要です。これは支払いが必要な商用パッケージです。

このthreadは、pyodbcモジュール経由でODBCを使用することを示しています。また、JT400ツールキットによるJDBCも動作することを示唆しています。

+0

クイック返信ありがとう。私は彼らに港を二重チェックするように頼むが、誰もそれらを改造していないと言われている。私が8471の代わりに446を試してみると、次のコマンドやSQL文の実行に影響を与える通信データ・ストリームのエラーのために、「SQL文の実行に失敗しました。"SQLCode = -30020-0206、SQLState = 58009 – AH16

+0

私は必要なIBMドライバと製品がすべてインストールされているということを忘れていました(私たちの会社にはアクセスできます)。私の港は標準のものと同じように設定されています(446と8471は2つの可能なものです)。 、8471はハングし、エラーやタイムアウトは発生しませんが、2秒以内に446エラーが発生します – AH16

+0

チャールズの答えに少し追加するには、ネット上のほとんどすべての例がDB2 LUWまたはメインフレーム用のDB2用です。また、AS400ではなく、ヘルプを探すときには本当に重要です。誰かがAS/400として何かを投稿した場合、それは古代のものか古代のものかどちらも有用ではないでしょう。 IBM iまたはiSeriesまでお試しください。 –

0

ここでは、as400、sqlalchemy、およびpandasを使用する例を示します。 このeximppleはcsvファイルの束を取り、pandas/sqlalchemyで挿入します。 のみのiシリーズのODBCドライバのセグメンテーション違反(CentOSに7とDebian 9 x68_64)

クライアントがWindows 10であるが、Linux上で、窓のために働く

私のAS400のバージョンが7.3

Pythonは2.7.14

されていますピップと一緒にインストールさ

:パンダ、pyodbc、imb_db_sa、SQLAlchemyの

あなたはftp://public.dhe.ibm.com/as400/products/clientaccess/win32/v7r1m0/servicepack/si66062/

から、私は窓のためにアクセスしインストールする必要がありますpyodbc.py Cの@JohnYによって

Aditionally修正:\ Python27 \ Libの\サイト - パッケージ\ SQLAlchemyの方言\ \ ibm_db_sa \ pyodbc.py 変更ライン99

pyodbc_driver_name = "IBM i Access ODBC Driver" 

にODBCドライバが、それはだ変更しました名。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import pandas as pd 
import numpy as np 
from sqlalchemy import create_engine 
import glob 

csvfiles=(glob.glob("c:/Users/nahum/Documents/OUT/*.csv")) 
df_csvfiles = pd.DataFrame(csvfiles) 
for index, row in df_csvfiles.iterrows(): 
    datastore2=pd.read_csv(str(row[0]), delimiter=',', header=[0],skipfooter=3) 
    engine = create_engine('ibm_db_sa+pyodbc://DB2_USER:[email protected]_SERVER/*local') 
    datastore2.to_sql('table', engine, schema='SCHEMA', chunksize=1000, if_exists='append', index=False) 

希望します。

関連する問題