从查询列中分割字符串并将结果插入到同一表中

时间:2018-08-21 21:36:41

标签: python database loops for-loop pyodbc

我在数据库中有一个表,其中一列同时包含名字和名字(按空格分隔)。

我正在尝试加载这些数据,拆分每一行并将其再次保存到表中。可以显示该数据,但是当我尝试将其保存回去时,我会得到

  

“ NoneType”对象没有属性“ 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()

如果没有这两行的话就可以正常工作,并且我可以在控制台中显示数据,因此这两行有问题:

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

我也尝试创建两个connection.cursor对象,但是即使我只是使用它也无法工作

cursor = connection.cursor()

谢谢您的建议,

瓦茨拉夫

2 个答案:

答案 0 :(得分:1)

问题很可能是您在单个连接上保持两个游标处于打开状态。尝试获取第一个查询rows = cursor.execute(sql).fetchall()的所有行,然后对其进行迭代。

您可以通过运行以下命令检查这是否是问题的根源(如建议here):

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

答案 1 :(得分:0)

因此很不幸,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()

所以我:

  1. 将光标复制到列表中-> mylist1 = list(cursor)
  2. 对列表进行深度复制-> mylist2 = copy.deepcopy(mylist1)
  3. 浏览了该深层复制列表
  4. 我最后也缺少connection.commit()

但是还是谢谢您的帮助。

瓦茨拉夫