【问题标题】:Python SQL script inserts only the last row of the dataframe to SQL Server [pyodbc]Python SQL 脚本仅将数据帧的最后一行插入到 SQL Server [pyodbc]
【发布时间】:2020-05-12 04:11:39
【问题描述】:

我正在尝试将 pandas 数据框导入 Microsoft SQL Server。即使命令正确并成功执行,当我在 SQL Server 中选择表的前 1000 行时,只显示导入数据框的最后一行。

我有最新版本的 SQL Server(昨天下载)

你知道是什么原因造成的吗?

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()

我要导入的数据框

SQL 结果

【问题讨论】:

    标签: python sql sql-server pandas pyodbc


    【解决方案1】:

    我在 SQL Server 中选择表的前 1000 行,只显示导入数据框的最后一行。

    因为您的存储过程每次在插入行之前都会删除表。

    所以不要那样做。也不要在列名中使用@。这仅适用于参数、参数和局部变量。

    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;
    

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 2022-12-12
      • 2019-12-21
      相关资源
      最近更新 更多