ホーム>source

データベースにテーブルがあり、1つの列に名前と2番目の名前が一緒に含まれています(スペースで区切られています)。

これらのデータをロードし、各行を分割して、再びテーブルに保存しようとしています。そのデータを表示することは可能ですが、保存して戻そうとすると、

'NoneType' object has no attribute 'split'.

import sys, os, pyodbc
conn_str = (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
    r'DBQ=C:/Users/vlcek/Desktop/pokusdb.accdb;'
    )
connection = pyodbc.connect(conn_str)
cursor = connection.cursor()
cursor2 = connection.cursor()
sql="Select whole_name from people"
cursor.execute(sql)
for change in cursor:
    devided=change[0].split()
    print(devided[0]+"--"+devided[1])
    sql2="Insert into people (user_id, Name, Surname) values (27, ?,?)"
    cursor2.execute(sql2,(devided[0],devided[1]))

connection.close()

これらの2行がなければうまく動作し、コンソールでデータを表示できるので、これらの2行に問題があります。

sql2="Insert into people (user_id, Name, Surname) values (27, ?,?)"
cursor2.execute(sql2,(devided[0],devided[1]))

2つのconnection.cursorオブジェクトも作成しようとしましたが、使用しただけでも機能しません

cursor = connection.cursor()

ご助言ありがとうございます、

ヴァーツラフ

あなたの答え
  • 解決した方法 # 1

    問題は、1つの接続で2つのカーソルを開いたままにしている可能性が高いことです。最初のクエリ rows = cursor.execute(sql).fetchall() のすべての行を取得してください  そして、これらを繰り返します。

    次のコマンドを実行すると、これが問題の原因であるかどうかを確認できます(ここで提案されているとおり)。

    how_many = connection.getinfo(pyodbc.SQL_MAX_CONCURRENT_ACTIVITIES)
    print(how_many)
    
    

  • 解決した方法 # 2

    残念ながら、fetchall()も機能しません。これは最終的に私の解決策でした

    import sys, os, pyodbc, copy
    conn_str = (
        r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
        r'DBQ=C:/Users/vlcek/Desktop/pokusdb.accdb;'
        )
    connection = pyodbc.connect(conn_str)
    cursor = connection.cursor()
    sql="Select whole_name from people"
    cursor.execute(sql)
    mylist1=list(cursor)
    mylist2=copy.deepcopy(mylist1)
    
    for change in mylist2:
        devided=change[0].split()
        print(devided[0]+"--"+devided[1])
        sql2="Insert into people (user_id, Name, Surname) values (27, ?,?)"
        cursor.execute(sql2,(devided[0],devided[1]))
    connection.commit()
    connection.close()
    
    

    だから私は:

    カーソルをリストにコピー-> mylist1 = list(カーソル)

    リストのディープコピーを作成-> mylist2 = copy.deepcopy(mylist1)

    ディープコピーされたリストを反復処理した

    最後にconnection.commit()もありませんでした。

    とにかく助けてくれてありがとう。

    ヴァーツラフ

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ html - フレックスリストの次の列間のギャップを削除する