Как добавить новые записи в таблицу SQL Server со столбцом AUTO INCREMENT / IDENTITY?
Есть CSV файл с полностью совпадающими столбцами с уже существующей таблицей БД SQL Server, кроме одного - в SQL Server есть столбец rid - счетчик, уникальный номер записи в таблице, который является автоматическим.
Необходимо записать строки CSV файла в конец БД SQL Server.
Детали:
- Добавление нужно осуществить с помощью Python.
- В Python я открыла CSV_file и таблицу БД SQL Server, как DataFrame.
ridне совпадает с простым счетчиком строк, который показывает в Jupyterrid 0 451 1 452 2 453 3 454 4 455 ... 211 662 212 663 213 664 214 665 215 666- Для связки с БД я использую библиотеку
pyodbc.
Скрипт связки с таблицей:
conn = pyodbc.connect('Driver={SQL Server};'
'Server=название_сервера;'
'Database=название_БД;'
'username=юзер;'
'password=пароль;')
cursor = conn.cursor()
sql_query = pd.read_sql_query('SELECT * FROM [dbo].[название_таблицы]',conn)
Также я попробовала библиотеку sqlAlchemy, но код с ней хочет создать новую таблицу, а не вставить новые записи в уже существующую.
from sqlalchemy import create_engine
engine = create_engine('mssql+pyodbc://имя_юзера:пароль@мой_дсн')
датафрейм.to_sql("[dbo].[название_таблицы]", engine, index=False, if_exists="append")
Ответы (2 шт):
В теории должен работать такой вариант, если в DataFrame'е отсутствует столбец rid. Т.е. столбец с AUTO INCREMENT на стороне SQL-Server должен отсутствовать в Pandas DataFrame.
import mssql
from sqlalchemy import create_engine
# pymssql
engine = create_engine('mssql+pymssql://user:password@hostname:port/dbname')
# pyodbc
# engine = create_engine('mssql+pyodbc://user:password@mydsn')
df.to_sql("mytable", engine, index=False, if_exists="append")
PS у меня нет доступа к SQL Server, поэтому я не могу проверить данный код
import urllib
from sqlalchemy import create_engine
import pyodbc
params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};SERVER=dagger;DATABASE=test;UID=user;PWD=password")
engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
df.to_sql("mytable", engine, index=False, if_exists="append")
Данный ответ был получен с помощью связки ответа на данный вопрос и ответа на этот вопрос.