0

Python 3.4.3、MariaDB 10.0.21、MariaDB ODBC Connector 1.0.0、pypyodbc 1.3.3、すべて 64 ビット Windows 7 上の 64 ビット。

テーブルを作成し、固定幅ファイルからデータを入力し、それに対して SELECT ステートメントを実行することになっている Python スクリプトがあります。すべての単純なもの。私のスクリプトは次のようになります。

import pypyodbc

def do_stuff(name, password, filepath):
    db = pypyodbc.connect(driver = "{MariaDB ODBC 1.0 Driver}",
                    server = "localhost", uid = name,
                    pwd = password, autocommit = True)

    cursor = db.cursor()

    cursor.execute("CREATE TABLE `foo`.`bar` (`col1` INT);")
    cursor.execute("LOAD DATA LOCAL INFILE '%s' INTO TABLE `foo`.`bar` (@row) SET col1 = SUBSTR(@row,1,1)" % filepath.replace("\\", "\\\\"))
    for row in cursor.execute("SELECT * FROM `foo`.`bar`"):
        print(row)
    db.close()

do_stuff("root", "password", r"C:\\Users\\laj\\Desktop\\test.txt")

テキスト ファイルの各行から最初の文字を取得し、テーブルの唯一の列に貼り付けます。ただし、「SELECT」ステートメントが来ると、次のエラーが発生します。

Traceback (most recent call last):
  File "test.py", line 25, in <module>
    do_stuff("root", "oag123", r"C:\\Users\\laj\\Desktop\\test.txt")
  File "test.py", line 21, in do_stuff
    for row in cursor.execute("SELECT * FROM `foo`.`bar`"):
  File "C:\Python34\lib\site-packages\pypyodbc-1.3.3-py3.4.egg\pypyodbc.py", line 1605, in execute
  File "C:\Python34\lib\site-packages\pypyodbc-1.3.3-py3.4.egg\pypyodbc.py", line 1631, in execdirect
  File "C:\Python34\lib\site-packages\pypyodbc-1.3.3-py3.4.egg\pypyodbc.py", line 986, in check_success
  File "C:\Python34\lib\site-packages\pypyodbc-1.3.3-py3.4.egg\pypyodbc.py", line 964, in ctrl_err
pypyodbc.Error: ('HY000', '[HY000] Unknown prepared statement handler (5) given to mysqld_stmt_reset')

しかし、本当に気になるのは、次のように、テーブルにデータを入力してから「SELECT」を実行するまでの間にデータベース接続を閉じてから再度開くだけで、エラーを取り除くことができるということです。

import pypyodbc

def do_stuff(name, password, filepath):
    db = pypyodbc.connect(driver = "{MariaDB ODBC 1.0 Driver}",
                    server = "localhost", uid = name,
                    pwd = password, autocommit = True)

    cursor = db.cursor()

    cursor.execute("CREATE TABLE `foo`.`bar` (`col1` INT);")
    cursor.execute("LOAD DATA LOCAL INFILE '%s' INTO TABLE `foo`.`bar` (@row) SET col1 = SUBSTR(@row,1,1)" % filepath.replace("\\", "\\\\"))

    db.close()
    db = pypyodbc.connect(driver = "{MariaDB ODBC 1.0 Driver}",
                    server = "localhost", uid = name,
                    pwd = password, autocommit = True)

    cursor = db.cursor()


    for row in cursor.execute("SELECT * FROM `foo`.`bar`"):
        print(row)
    db.close()

do_stuff("root", "password", r"C:\\Users\\laj\\Desktop\\test.txt")

残念ながら、これは実際には私の問題に対する有効な解決策ではありません。これは私がする必要のないことであるだけでなく、「修正」の切断フェーズ中にドロップされるだけなので、一時テーブルに関しては役に立ちません。どんな洞察も素晴らしいでしょう、これは私を壁に追いやっています。

4

2 に答える 2

0

pypyodbc の問題であることが判明しました。pyodbc をインストールし、それを pypyodbc としてインポートすると、すべてが正常に機能しました。

于 2015-09-10T16:17:38.300 に答える
0

executeあなたの考えを返しません:

cursor.execute("SELECT ...");
rows = cur.fetchall();
for row in rows ...
于 2015-09-09T02:02:25.457 に答える