У меня есть код Python, который отлично работает, когда я запускаю его из PyCharm.
Но когда я запускаю тот же код с SQL сервера, используя sp_execute_external_script
, я получаю сообщение об ошибке. Есть идеи, что здесь происходит?
Код Python:
import pyodbc
from pandas import DataFrame, read_csv
import glob
def main():
fullFilePath = r"D:\raw files"
conn = pyodbc.connect(
"DRIVER={ODBC Driver 17 for SQL Server};"
"Server=DESKTOP-PCV7785;"
"Database=practice_db;"
"Trusted_Connection=yes;"
)
cursor = conn.cursor()
try:
cursor.execute("CREATE TABLE tbl_babyNames (babyName nvarchar(100), gender nvarchar(2), number int, fileName nvarchar(50))")
conn.commit()
except:
print("Table tbl_babyNames already exists")
files = 0
rows = 0
files_list = [f[len(fullFilePath)+1:] for f in glob.glob(fullFilePath + "\*.txt")]
for file in files_list:
data = read_csv(fullFilePath + "\\" + file, sep=",", header=None, index_col=None)
data.columns=["babyName", "gender", "number"]
df1 = DataFrame(data)
df1["fileName"] = file[:file.find(".txt")]
for row in df1.itertuples():
cursor.execute("""
INSERT INTO practice_db..tbl_babyNames(babyName, gender, number, fileName)
VALUES (?, ?, ?, ?)
""",
row.babyName,
row.gender,
row.number,
row.fileName)
rows += 1
conn.commit()
print("File : {} inserted".format(file))
files += 1
conn.close()
print("Insert is Done!, files: {0} , rows: {1}".format(files, rows))
main()
На чем я работаю SQL Сервер:
EXECUTE sp_execute_external_script @language = N'Python'
, @script = N'
import pyodbc
from pandas import DataFrame, read_csv
import glob
def main():
fullFilePath = r"D:\raw files"
conn = pyodbc.connect(
"DRIVER={ODBC Driver 17 for SQL Server};"
"Server=DESKTOP-PCV7785;"
"Database=practice_db;"
"Trusted_Connection=yes;"
)
cursor = conn.cursor()
try:
cursor.execute("CREATE TABLE tbl_babyNames (babyName nvarchar(100), gender nvarchar(2), number int, fileName nvarchar(50))")
conn.commit()
except:
print("Table tbl_babyNames already exists")
files = 0
rows = 0
files_list = [f[len(fullFilePath)+1:] for f in glob.glob(fullFilePath + "\*.txt")]
for file in files_list:
data = read_csv(fullFilePath + "\\" + file, sep=",", header=None, index_col=None)
data.columns=["babyName", "gender", "number"]
df1 = DataFrame(data)
df1["fileName"] = file[:file.find(".txt")]
for row in df1.itertuples():
cursor.execute("""
INSERT INTO practice_db..tbl_babyNames(babyName, gender, number, fileName)
VALUES (?, ?, ?, ?)
""",
row.babyName,
row.gender,
row.number,
row.fileName)
rows += 1
conn.commit()
print("File : {} inserted".format(file))
files += 1
conn.close()
print("Insert is Done!, files: {0} , rows: {1}".format(files, rows))
main()
'
Ошибка Я получаю:
Msg 39004, уровень 16, состояние 20, строка 10 Ошибка сценария «Python» во время выполнения sp_execute_external_script с HRESULT 0x80004004.
Msg 39019, уровень 16, состояние 2, строка 10 Произошла ошибка внешнего сценария:
Ошибка выполнения. Дополнительные сведения см. В выводе.
Отслеживание (последний вызов последний):
Файл "", строка 5, в Файл "C: \ ProgramData \ MSSQLSERVER \ Temp-PY \ Appcontainer1 \ BB9FCA34-F670-4555-8B58-B6A3C172718C \ sqlindb_0.py", строка 115, преобразованный main () Файл "C: \ ProgramData \ MSSQLSERVER \ Temp-PY \ Appcontainer1 \ BB9FCA34-F670-4555-8B58-B6A3C172718C \ sqlindb_0.py", строка 45, в основном «DRIVER = {ODB C Driver 17 for SQL Server};»
Msg 39019, уровень 16, состояние 2, строка 10 Произошла ошибка внешнего сценария:
pyodb c .OperationalError: ('08001', '[08001] [Microsoft] [ODB C Driver 17 для SQL Server] Поставщик именованных каналов: не удалось открыть соединение с SQL Server [5]. (5) (SQLDriverConnect); [08001] [Microsoft] [ODB C Driver 17 для SQL Server] Истекло время ожидания входа в систему (0); [08001] [Microsoft] [ODB C Driver 17 для SQL Server] Произошла ошибка c, связанная с сетью или специфическая для экземпляра, при установке соединения с SQL сервером. Сервер не найден или недоступен. Проверьте правильность имени экземпляра и настройку сервера SQL на разрешение удаленных подключений. Для получения дополнительной информации см. SQL Серверную документацию. (5) ')
Ошибка SqlS satelliteCall: Ошибка выполнения. Проверьте вывод для получения дополнительной информации. Сообщение (я) STDOUT от внешнего скрипта: сбой функции SqlS satelliteCall. Дополнительные сведения см. В выводе консоли.
Traceback (последний вызов последним): Файл "C: \ Program Files \ Microsoft SQL Server \ MSSQL15.MSSQLSERVER \ PYTHON_SERVICES \ lib \ site-packages \ revoscalepy \ computecontext \ RxInSqlServer.py", строка 605 в rx_sql_s satellite_call rx_native_call ("SqlSatellCall", параметры) Файл "C: \ Program Files \ Microsoft SQL Server \ MSSQL15.MSSQLSERVER \ PYTHON_SERVICES \ lib \ site-packages \ revoscalepy \ RxSerializable.py", строка 375, в rx_native_call ret = px_call (functionname, params) RuntimeError: сбой функции revoscalepy.