Я хочу обновить столбец с запросом 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
Я обновил свой контент. но имейте в виду, что я не создаю таблицу. У меня есть таблица, и я должен обновить определенный столбец.
имейте в виду, что я не создаю таблицу. Но эта таблица существует, поэтому у нее есть структура, которую можно предоставить.
Я тоже поделился структурой таблицы/
Показывает ли пример исходной таблицы ее текущее состояние? если это так, то данные для обновления таблицы и набор значений Name
уже доступны в таблице, и вам вообще не нужен ваш SCV.
PS. Имя таблицы в показанном коде — database.dbo.tablename
, что соответствует диалекту SQL Server (MS SQL), а не MySQL. Пожалуйста, внимательно смотрите, с каким сервером БД вы имеете дело.
Нет, у меня есть файл csv с некоторыми значениями A, я собираюсь изменить значение A и поместить его в значение имени. это пример. представьте, что в моей таблице 10000 строк, а в файле csv указано только значение 100 A, поэтому я использую регулярное выражение, чтобы получить ожидаемую строку и поместить ее в значение имени. Я не знаю, как поместить обновленное значение имени в таблицу.\
Пожалуйста, прочтите еще один - "Показать полную таблицу CREATE TABLE, образец данных для таблицы (3-5 строк) и для файла CSV (2-3 строки) и желаемый результат (содержимое таблицы после обновления)". Вы должны показать, какие данные у вас есть изначально, какие значения предоставлены в файле и в какие значения они объединены. Мы должны увидеть и понять алгоритм сопоставления и преобразования. Теперь я не могу найти разницу между значениями table.A
и данными файла CSV - поэтому я не могу найти причину вообще использовать файл.
Было указано значение, поэтому я использую регулярное выражение, чтобы получить ожидаемую строку и поместить ее в значение имени. Предоставьте значение из файла в MySQL как есть - он может извлечь нужную часть и создать нужное имя более простым способом.
Моя ошибка была связана с mysql. Это сервер 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 и не создавать временную таблицу?
Вы могли бы, но я представляю, что это потребует создания синтаксиса в цикле Python из-за необходимости оператора case SQL. Я думаю, что это также будет наиболее эффективным подходом.
У меня есть файл CSV со значением A в столбце Доступен ли этот файл для доступа к серверу MySQL? Покажите полную таблицу CREATE TABLE, образец данных для таблицы (3-5 строк) и для CSV-файла (2-3 строки) и желаемый результат (содержимое таблицы после обновления). Также укажите точную версию MySQL.