Python SQL 脚本仅将数据帧的最后一行插入到 SQL 服务器 [pyodbc]
Python SQL script inserts only the last row of the dataframe to SQL Server [pyodbc]
我正在尝试将 pandas 数据框导入 Microsoft SQL 服务器。即使命令正确并成功执行,当我 select SQL 服务器中 table 的前 1000 行时,只显示导入数据帧的最后一行。
我有最新版本的SQL服务器(昨天下载)
你知道是什么原因造成的吗?
SQL代码(存储过程)
USE [Movies_Dataset]
GO
/****** Object: StoredProcedure [dbo].[store_genres] Script Date: xxx ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[store_genres]
@Movie_Title NVARCHAR(MAX),
@Genres NVARCHAR(MAX)
AS
BEGIN
DROP TABLE IF EXISTS [dbo].[table_genres];
CREATE TABLE [dbo].[table_genres]([@Movie_Title] NVARCHAR(MAX),
[@Genres] NVARCHAR(MAX)
)
INSERT INTO [dbo].[table_genres]
VALUES
( @Movie_Title,
@Genres
)
END;
Python 导入数据的脚本
connStr = pyodbc.connect("DRIVER={SQL Server Native Client 11.0};"
"SERVER=LAPTOP-IFTEP7AL;"
"DATABASE=Movies_Dataset;"
"Trusted_Connection=yes")
cursor = connStr.cursor()
delete_table = """
IF dbo.TableExists('table_genres') = 1
DELETE FROM table_genres
"""
insert_values = """
EXEC [dbo].[store_genres] @Movie_Title = ?, @Genres = ?;
"""
cursor.execute(delete_table)
for index, row in genres.iterrows():
params = (row['title'], row['genres'])
cursor.execute(insert_values, params)
connStr.commit()
cursor.close()
connStr.close()
我要导入的Dataframe
SQL 结果
I select the first 1000 rows of the table in SQL server only the last row of the imported dataframe is shown.
因为您的存储过程每次在插入行之前都会删除 table。
所以不要那样做。也不要在您的列名中使用 @
。那只是参数、自变量和局部变量。
EG:
USE [Movies_Dataset]
GO
SET QUOTED_IDENTIFIER ON
GO
DROP TABLE IF EXISTS [dbo].[table_genres];
CREATE TABLE [dbo].[table_genres]([Movie_Title] NVARCHAR(MAX),
[Genres] NVARCHAR(MAX)
)
GO
/****** Object: StoredProcedure [dbo].[store_genres] Script Date: xxx ******/
SET ANSI_NULLS ON
GO
CREATE OR ALTER PROCEDURE [dbo].[store_genres]
@Movie_Title NVARCHAR(MAX),
@Genres NVARCHAR(MAX)
AS
BEGIN
INSERT INTO [dbo].[table_genres](Movie_Title,Genres)
VALUES
( @Movie_Title,
@Genres
)
END;
我正在尝试将 pandas 数据框导入 Microsoft SQL 服务器。即使命令正确并成功执行,当我 select SQL 服务器中 table 的前 1000 行时,只显示导入数据帧的最后一行。
我有最新版本的SQL服务器(昨天下载)
你知道是什么原因造成的吗?
SQL代码(存储过程)
USE [Movies_Dataset]
GO
/****** Object: StoredProcedure [dbo].[store_genres] Script Date: xxx ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[store_genres]
@Movie_Title NVARCHAR(MAX),
@Genres NVARCHAR(MAX)
AS
BEGIN
DROP TABLE IF EXISTS [dbo].[table_genres];
CREATE TABLE [dbo].[table_genres]([@Movie_Title] NVARCHAR(MAX),
[@Genres] NVARCHAR(MAX)
)
INSERT INTO [dbo].[table_genres]
VALUES
( @Movie_Title,
@Genres
)
END;
Python 导入数据的脚本
connStr = pyodbc.connect("DRIVER={SQL Server Native Client 11.0};"
"SERVER=LAPTOP-IFTEP7AL;"
"DATABASE=Movies_Dataset;"
"Trusted_Connection=yes")
cursor = connStr.cursor()
delete_table = """
IF dbo.TableExists('table_genres') = 1
DELETE FROM table_genres
"""
insert_values = """
EXEC [dbo].[store_genres] @Movie_Title = ?, @Genres = ?;
"""
cursor.execute(delete_table)
for index, row in genres.iterrows():
params = (row['title'], row['genres'])
cursor.execute(insert_values, params)
connStr.commit()
cursor.close()
connStr.close()
我要导入的Dataframe
SQL 结果
I select the first 1000 rows of the table in SQL server only the last row of the imported dataframe is shown.
因为您的存储过程每次在插入行之前都会删除 table。
所以不要那样做。也不要在您的列名中使用 @
。那只是参数、自变量和局部变量。
EG:
USE [Movies_Dataset]
GO
SET QUOTED_IDENTIFIER ON
GO
DROP TABLE IF EXISTS [dbo].[table_genres];
CREATE TABLE [dbo].[table_genres]([Movie_Title] NVARCHAR(MAX),
[Genres] NVARCHAR(MAX)
)
GO
/****** Object: StoredProcedure [dbo].[store_genres] Script Date: xxx ******/
SET ANSI_NULLS ON
GO
CREATE OR ALTER PROCEDURE [dbo].[store_genres]
@Movie_Title NVARCHAR(MAX),
@Genres NVARCHAR(MAX)
AS
BEGIN
INSERT INTO [dbo].[table_genres](Movie_Title,Genres)
VALUES
( @Movie_Title,
@Genres
)
END;