Escape-последовательность Python и MySQL для пути UNC

0

У меня есть время, затрачиваемое на работу с python с локальным вторжением данных нагрузки. Я попробовал кучу разных способов в Python 3.6.5:

sqlpath = '\\corp.domain.com\dept\DCGSI\Extracts\SIM\'
sqlpath = "\\corp.domain.com\dept\DCGSI\Extracts\SIM\"
sqlpath = '\\\\corp.domain.com\\dept\\DCGSI\\Extracts\\SIM\\'
sqlpath = '//corp.domain.com/dept/DCGSI/Extracts/SIM/'
sqlpath = os.path.join("\\corp.domain.com","dept","DCGSI","Extracts","SIM")
sqlpath = os.path("\\\\corp.domain.com\dept\DCGSI\Extracts\SIM\")

Кажется, я не могу убедить себя в следующем, чтобы сохранить разумность. Я прочитал здесь по меньшей мере 10 различных сообщений и пробовал все эти предложения. Что я делаю неправильно, поэтому я могу использовать путь unc в loadQuery.

Вот полный сценарий (CURRENT):

import config
import os
import pymysql


username = config.username
dbpassword = config.dbpassword
dbhost = config.dburl
conn =  pymysql.connect(host=dbhost, port=3306,user=username,password=dbpassword,db='dcgsreports',autocommit=True,local_infile=1)
path = '//corp.domain.com/dept/DCGSI/Extracts/SIM'
tables = []
files = []

fileNames = os.listdir(path)
for fileNames in fileNames:
    if fileNames.endswith(".csv"):
        files.append(fileNames)
        tables.append(fileNames.split('.')[0])

for f,t in zip(files, tables) :
    truncQuery = '''TRUNCATE TABLE %s''' %t
    loadQuery = '''LOAD DATA LOCAL INFILE '//corp.domain.com/dept/DCGSI/Extracts/SIM/%s' INTO TABLE %s FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES;''' %(f, t)
    print(loadQuery)
    cursor = conn.cursor()
    cursor.execute(truncQuery)
    cursor.execute(loadQuery)
    conn.commit()
conn.close()

этот оператор печати показывает, что следующее должно быть передано в качестве запроса (что должно быть правильно): LOAD DATA LOCAL INFILE '//corp.domain.com/dept/DCGSI/Extracts/SIM/SIM_Availability.csv' INTO TABLE SIM_Availability FIELDS TERMINATED BY ',' ДОПОЛНИТЕЛЬНО ЗАКЛЮЧЕНЫ '' 'ЛИНИЯМИ, ПРЕКРАЩЕННЫМИ' 'IGNORE 1 LINES;

Все таблицы пустые, хотя это указывает на то, что выполняется только truncQuery.

  • 1
    Используйте курсор и подготовленное утверждение, тогда вам не нужно беспокоиться о побеге.
  • 0
    Я не могу использовать подготовленный оператор для загрузки нескольких файлов из каталога, могу ли я? позвольте мне опубликовать весь сценарий. Я должен был в любом случае
Показать ещё 4 комментария
Теги:
python-3.x
unc

1 ответ

0
Лучший ответ

Рассмотрим Python os- os.path.join() и не волнуйтесь о косых os.path.join() или косых чертах. И используйте string.format или даже Python 3.6 новую f-строку (интерполяцию литерала, как Perl и Perl $ string). Оператор модуля для интерполяции строк не рекомендуется. Обязательно commit действия:

path = r"\\corp.domain.com\dept\DCGSI\Extracts\SIM"

for t, f in zip(tables, files) :

    truncQuery = "TRUNCATE TABLE '{t_name}'"
    loadQuery = """LOAD DATA LOCAL INFILE '{f_name}'
                   INTO TABLE '{t_name}' FIELDS TERMINATED BY ',' 
                   OPTIONALLY ENCLOSED BY '"' LINES 
                   TERMINATED BY '\r\n' IGNORE 1 LINES;"""

    print(loadQuery)

    cursor = conn.cursor()
    cursor.execute(truncQuery.format(t_name = t)
    cursor.execute(loadQuery.format(f_name = os.path.join(path, f),
                                    t_name = t))

    cursor.close()
    conn.commit()

С f-строкой

for t, f in zip(tables, files) :

    f_name = os.path.join(path, f)

    truncQuery = f"TRUNCATE TABLE '{t}'"
    loadQuery = f"""LOAD DATA LOCAL INFILE '{f_name}'
                    INTO TABLE '{t}' FIELDS TERMINATED BY ',' 
                    OPTIONALLY ENCLOSED BY '"' LINES 
                    TERMINATED BY '\r\n' IGNORE 1 LINES;"""

    print(loadQuery)

    cursor = conn.cursor()
    cursor.execute(truncQuery)
    cursor.execute(loadQuery)

    cursor.close()
    conn.commit()
  • 0
    Первый дает синтаксическую ошибку. Второй кажется чистым, но вот наш результат 1064: «У вас есть ошибка в вашем синтаксисе SQL; обратитесь к руководству, соответствующему вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с \\\\ corp.domain.com \ \ dept \\ DCGSI \\ Извлекает \\ SIM \\ SIM_Availability.csv INTO TABLE SIM_Ava 'в строке 1 "по любой причине, по которой он вставляет управляющие символы. Мне интересно, делает ли Spyder что-то неожиданное.
  • 0
    в результате редактирования возникает следующая ошибка: 1017, «Не удается найти файл 'b' \\\\ corp.domain.comdeptDCGSIExtractsSIMSIM_Availability.csv ''» (та же ошибка, что и раньше). Первая ошибка в cursor.execute (loadQuery.format (f_name = os.path.join (path, f), t_name = t)
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню