ОБНОВЛЕНИЕ значений столбца в таблице с Python в SQL Server

Я хочу обновить столбец с запросом SQL-сервера в python, как вы видите, я обновляю относительный столбец, как показано ниже: У меня есть файл CSV с некоторыми значениями A относительной таблицы, как показано ниже:

CSV-файл: (a.csv)

ART-B-C-ART0015-D-E01
ADC-B-C-ADC00112-V-E01

Код Python: (создайте значение имени)

ff = pd.read_csv("C:\\a.csv",encoding='cp1252')
ff["Name"]= df["A"].str.extract(r'([a-zA-Z]{3}\d{4,5})') + "-A"

Результат кода Python:

ART0015-A
ADC00112-A

Стол :

A                              Name                     FamilyName
ART-B-C-ART0015-D-E01          NULL                        ART
ADC-B-C-ADC00112-V-E01         NULL                      ADC00112

Также A является столбцом в моей таблице (не все записи A, а некоторые из них), и на основе значения A я хочу обновить столбец Name. Моя база данных - это SQL Server, и я не знаю, как обновить столбец имени в SQL Server, где значение A в файле csv равно A в относительной таблице. Код на Питоне:

conn = pyodbc.connect('Driver = {SQL Server}; Server=ipaddress; Database=dbname; UID=username; PWD= {password};')
cursor = conn.cursor()
conn.commit()
for row in ff.itertuples():
    cursor.execute('''UPDATE database.dbo.tablename SET Name where ?

)

conn.commit()

Ожидаемый результат в таблице

A                              Name                     FamilyName
ART-B-C-ART0015-D-E01          ART0015-A                 ART
ADC-B-C-ADC00112-V-E01         ADC00112-A                ADC00112

У меня есть файл CSV со значением A в столбце Доступен ли этот файл для доступа к серверу MySQL? Покажите полную таблицу CREATE TABLE, образец данных для таблицы (3-5 строк) и для CSV-файла (2-3 строки) и желаемый результат (содержимое таблицы после обновления). Также укажите точную версию MySQL.

Akina 12.12.2020 11:59

Я обновил свой контент. но имейте в виду, что я не создаю таблицу. У меня есть таблица, и я должен обновить определенный столбец.

Sara Daniel 12.12.2020 12:07

имейте в виду, что я не создаю таблицу. Но эта таблица существует, поэтому у нее есть структура, которую можно предоставить.

Akina 12.12.2020 12:08

Я тоже поделился структурой таблицы/

Sara Daniel 12.12.2020 12:16

Показывает ли пример исходной таблицы ее текущее состояние? если это так, то данные для обновления таблицы и набор значений Name уже доступны в таблице, и вам вообще не нужен ваш SCV.

Akina 12.12.2020 12:18

PS. Имя таблицы в показанном коде — database.dbo.tablename, что соответствует диалекту SQL Server (MS SQL), а не MySQL. Пожалуйста, внимательно смотрите, с каким сервером БД вы имеете дело.

Akina 12.12.2020 12:19

Нет, у меня есть файл csv с некоторыми значениями A, я собираюсь изменить значение A и поместить его в значение имени. это пример. представьте, что в моей таблице 10000 строк, а в файле csv указано только значение 100 A, поэтому я использую регулярное выражение, чтобы получить ожидаемую строку и поместить ее в значение имени. Я не знаю, как поместить обновленное значение имени в таблицу.\

Sara Daniel 12.12.2020 12:21

Пожалуйста, прочтите еще один - "Показать полную таблицу CREATE TABLE, образец данных для таблицы (3-5 строк) и для файла CSV (2-3 строки) и желаемый результат (содержимое таблицы после обновления)". Вы должны показать, какие данные у вас есть изначально, какие значения предоставлены в файле и в какие значения они объединены. Мы должны увидеть и понять алгоритм сопоставления и преобразования. Теперь я не могу найти разницу между значениями table.A и данными файла CSV - поэтому я не могу найти причину вообще использовать файл.

Akina 12.12.2020 12:24

Было указано значение, поэтому я использую регулярное выражение, чтобы получить ожидаемую строку и поместить ее в значение имени. Предоставьте значение из файла в MySQL как есть - он может извлечь нужную часть и создать нужное имя более простым способом.

Akina 12.12.2020 12:25

Моя ошибка была связана с mysql. Это сервер sql. Я старался изо всех сил, чтобы обновить содержание.

Sara Daniel 12.12.2020 12:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
10
2 237
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы использовал временную таблицу SQL и внутреннее соединение для обновления значений. Это будет работать только для обновления подмножества записей в вашей таблице SQL. Это также может быть эффективно при обновлении многих записей.

SQL-курсор

# reduce number of calls to server on inserts
cursor.fast_executemany = True

Создать временную таблицу

statement = "CREATE TABLE #temp_tablename(A VARCHAR(200), Name VARCHAR(200))"
cursor.execute(statement)

Вставка значений во временную таблицу

# insert only the key and the updated values
subset = ff[['A','Name']]

# form SQL insert statement
columns = ", ".join(subset.columns)
values = '('+', '.join(['?']*len(subset.columns))+')'

# insert
statement = "INSERT INTO #temp_tablename ("+columns+") VALUES "+values
insert = [tuple(x) for x in subset.values]

cursor.executemany(statement, insert)

Обновление значений в основной таблице из временной таблицы

statement = '''
UPDATE
     tablename
SET
     u.Name
FROM
     tablename AS t
INNER JOIN 
     #temp_tablename AS u 
ON
     u.A=t.A;
'''

cursor.execute(statement)

Удалить временную таблицу

cursor.execute("DROP TABLE #temp_tablename")

Дорогой Джейсон. Спасибо. нет ли способа просто использовать запрос UPDATE database.dbo.tablename и не создавать временную таблицу?

Sara Daniel 12.12.2020 13:00

Вы могли бы, но я представляю, что это потребует создания синтаксиса в цикле Python из-за необходимости оператора case SQL. Я думаю, что это также будет наиболее эффективным подходом.

Jason Cook 12.12.2020 13:34

Другие вопросы по теме