【问题标题】:pypyodbc network path not working properlypypyodbc 网络路径无法正常工作
【发布时间】:2017-06-13 14:31:57
【问题描述】:

我正在使用 Python 3.6.1 和 pypyodbc 库将 .csv 文件导入 Management Studio 中的本地数据库。谁能告诉我为什么这段代码在 Management Studio 中可以正常工作,但在我的 pypyodbc 脚本中却不行?

Python 脚本运行时没有任何错误,但实际上并未将C:\MemberMapUpdates 中的新 .csv 文件插入到 CSVTest 表中。当我在管理工作室中运行该 SQL 命令时,它会按预期插入值。 任何见解表示赞赏。谢谢。

import pypyodbc
connection = pypyodbc.connect('Driver={SQL Server};'
                              'Server=SERVER-SQL;'
                              'Database=server1;'
                              'uid=sa;pwd=Pa$$word!')
cursor = connection.cursor()
SQLCommand = (
               '''
                 drop table if exists CSVTest

                 create table CSVTest
                 (dccode varchar(255),
                 member varchar(255),
                 date_sub date,
                 date_add date,
                 sa_update date,
                 buff_rad float,
                 geom varchar(255),
                 sub_type varchar(255),
                 notes varchar(255))


                 bulk
                 insert CSVTest
                 from 'C:\MemberMapUpdates\MemberMapUpdates.csv'
                 with (FIRSTROW = 3, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')
              '''
              )
cursor.execute(SQLCommand)
connection.close()
print('Process Completed')

已插入存储过程的更新脚本

import pypyodbc
#from osgeo import ogr

connection = pypyodbc.connect('Driver={SQL Server};'
                              'Server=SERVER-SQL;'
                              'Database=DB;'
                              'uid=sa;pwd=p@SSWORD!')
cursor = connection.cursor()
SQLCommand = ('exec FirstProcedure')
cursor.execute(SQLCommand)
connection.close()
print('Process Completed')

这是存储过程:

             drop table if exists CSVTest;

             create table CSVTest
             (dccode varchar(255),
             member varchar(255),
             date_sub date,
             date_add date,
             sa_update date,
             buff_rad float,
             geom varchar(255),
             sub_type varchar(255),
             notes varchar(255));


             bulk
             insert CSVTest
             from '\\NETWORKSHARE\MemberMapUpdates\MemberMapUpdates.csv'
             with (FIRSTROW = 3, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n');

【问题讨论】:

  • 这里有几个 DDL/DML 命令,并且游标一次只能运行一个。考虑将所有内容放在一个存储过程中并让 Python 调用它。
  • 感谢您的建议,但结果相同。
  • 你尝试了什么?您是否拆分了命令或运行了存储过程?请出示。
  • 你还在吗?我真的很想帮忙。你又尝试了什么?另外,您确定 Python 代码与您发布的完全一样吗?很难相信不会引发异常/错误,因为在语法上此查询无效,因为语句之间没有使用分号。它应该像在 SSMS 中一样失败。
  • @Parfait 抱歉,我们的服务器宕机了,所以事情一直很忙。谢谢你的回复。给我一点点,我会更新案例。谢谢。

标签: python sql csv pypyodbc


【解决方案1】:

这个难题中缺少的部分是connection.commit()

这是我的完整查询,使用与上面相同的存储过程:

import pypyodbc

connection = pypyodbc.connect('Driver={SQL Server};'
                              'Server=SERVER-SQL;'
                              'Database=DB;'
                              'uid=sa;pwd=PASSWORD;')
cursor = connection.cursor()
SQLCommand = ("exec FirstProcedure;")
cursor.execute(SQLCommand)
connection.commit()
connection.close()
print('Process Completed')

【讨论】:

  • 花了太长时间才找到这个答案,谢谢!! connection.comit() 部分甚至没有包含在 github 上的 pypyodbc README 文档中。
猜你喜欢
  • 1970-01-01
  • 2014-05-04
  • 2015-07-20
  • 2016-03-20
  • 2014-10-04
  • 1970-01-01
  • 2013-05-13
  • 2017-06-29
  • 1970-01-01
相关资源
最近更新 更多