Python入门第3天遇AttributeError:'str'对象无'cursor'属性求助
解决你的数据库连接游标错误问题
嘿,刚学Python第三天就折腾数据库连接,已经很棒啦!咱们先拆解下你碰到的问题:
你得到的AttributeError: 'str' object has no attribute 'cursor'错误,核心原因是你把con赋值成了一个字符串,而不是真正的数据库连接对象。
看你代码里的这段:
conStr = ('pyodbc.connect'+"('DRIVER={SQL Server};SERVER=%s;DATABASE=%s;UID=%s;PWD=%s')") % (server_name, database_name, uid, password) con = conStr
你这里只是把pyodbc.connect(...)这段代码拼成了一个字符串文本,并没有实际调用pyodbc.connect()函数来创建连接对象。所以con现在是个普通字符串,字符串当然没有cursor()方法啦!
修正后的代码
我们直接调用pyodbc.connect()函数,把正确的连接字符串传进去就行:
import pyodbc import getpass import sys server_name = input('Enter Server Name: ') database_name = input('Enter Database Name: ') uid = input('Enter User ID: ') password = getpass.getpass("Enter your password: ") querystring = "select top 1 * from SomeTable" # 先构造连接参数字符串,不需要包含pyodbc.connect conn_str = f"DRIVER={{SQL Server}};SERVER={server_name};DATABASE={database_name};UID={uid};PWD={password}" # 实际调用connect函数得到连接对象 con = pyodbc.connect(conn_str) cur = con.cursor() # 现在con是真正的连接对象,就能调用cursor()了 cur.execute(querystring) rows = cur.fetchall() for row in rows: print(row) # 记得最后关闭游标和连接哦 cur.close() con.close()
新手友好的优化建议
作为新手,建议用with语句来管理连接和游标,它会自动帮你关闭资源,避免忘记关闭导致的问题:
import pyodbc import getpass import sys server_name = input('Enter Server Name: ') database_name = input('Enter Database Name: ') uid = input('Enter User ID: ') password = getpass.getpass("Enter your password: ") querystring = "select top 1 * from SomeTable" conn_str = f"DRIVER={{SQL Server}};SERVER={server_name};DATABASE={database_name};UID={uid};PWD={password}" # with语句会自动处理连接的关闭 with pyodbc.connect(conn_str) as con: # 同样用with管理游标 with con.cursor() as cur: cur.execute(querystring) rows = cur.fetchall() for row in rows: print(row)
这样就不用手动调用close()了,更安全省心~
内容的提问来源于stack exchange,提问作者Bobby
相关产品推荐
相关产品推荐

