Python For数据帧的循环在生成SQL字符串时获取头行



我正在尝试使用Python中的循环将一些数据库附加到SQL服务器。当执行动态SQL字符串时,我得到以下错误。由于"DATABASE"是数据帧中的列标题,因此循环似乎将标题作为变量输入到动态SQL中。我想从数据帧中获取第一行数据,而不是标头。Python的新手(如果不是显而易见的话(。

ProgrammingError:('42000',"[42000][Microsoft][ODBC SQL Server Driver][SQL Server]发生文件激活错误。物理文件名"Database"可能不正确。诊断并更正其他错误,然后重试该操作。(5105((SQLExecDirectW("(

import os
import pyodbc
import pandas as pd
path = []
databases = []
path = 'Z:Test\'
for root, dirs, files in os.walk(r'Z:Test'):
for file in files:
if file.endswith('.mdf'):
databases.append([os.path.splitext(file)[0], path + file])
df = pd.DataFrame(databases, columns = ['Database','DatabasePath'])
conn = pyodbc.connect('Driver={SQL Server};'
'Server=Test;'
'Database=Master;'
'Trusted_Connection=yes;'
'autocommit=True;')
cursor = conn.cursor()
for x in df:
SQL = """DECLARE @SQL as nvarchar(max) set @SQL = N'CREATE DATABASE ' + QUOTENAME(?) + N' ON (FILENAME = N''' + REPLACE(?,'''','''''') + N''') FOR ATTACH;';
EXEC sys.sp_executesql @SQL;"""
cursor.execute(SQL, (x,x))

下面的操作成功了。我添加了i作为for循环的索引,还应用了iterrows()来获得cursor.execute()中所需的行和列

for i, x in df.iterrows():
SQL = """DECLARE @SQL as nvarchar(max) set @SQL = N'CREATE DATABASE ' + QUOTENAME(?) + N' ON (FILENAME = N''' + REPLACE(?,'''','''''') + N''') FOR ATTACH;';
EXEC sys.sp_executesql @SQL;"""
cursor.execute(SQL, (x['Database'],x['DatabasePath']))

最新更新