【问题标题】:Execute sp_rename SQL command using pypyodbc使用 pypyodbc 执行 sp_rename SQL 命令
【发布时间】:2019-07-26 00:51:50
【问题描述】:

最初我使用以下命令重命名 SQL 表:

Q = """sp_rename {}, {}""".format(OLD_TABLE_NAME,NEW_TABLE NAME)

但是,这导致了“超出锁定请求超时期限”错误,我认为这是由于在查询末尾缺少“提交”(尽管我对此没有信心)。

因此,我采用了一个新查询(改编自 this question)。

Q2 = """BEGIN TRANSACTION
    GO
    EXECUTE sp_rename N'{}', N'{}', 'OBJECT' 
    GO
    ALTER TABLE {} SET (LOCK_ESCALATION = TABLE)
    GO
    COMMIT""".format(OLD_TABLE_NAME,NEW_TABLE NAME,NEW_TABLE NAME)

但是,我现在收到 ProgrammingError 提示“'GO' 附近的语法不正确。”

我是否需要删除 Q2 的某些部分才能使查询正常工作?还是其他部分有问题?

以下是我用来连接 SQL 服务器的两个函数:

from sqlalchemy import create_engine
import pypyodbc as pp

server1 = {
        'drivername': 'mssql+pyodbc',
        'servername': 'SERVERNAME',
        #'port': '5432',
        'username': 'WebAccess',
        'password': ':|Ax-*6_6!5H',
        'driver': 'SQL Server Native Client 11.0',
        'trusted_connection': 'yes',  
        'legacy_schema_aliasing': False
        }

def getEngine(servername, database):
    DB = server1

    #Create connection to SQL database
    DB['database'] = database

    servername1 = servername.lower()

    engine = create_engine('mssql+pyodbc://' + DB['username'] + ':' + DB['password'] + '@' + DB['servername'] + '/' + DB['database'] + '?' + 'driver=' + DB['driver'])#, echo=True)

    return engine



def SQLcommand(query,servername,database):

    connection = pp.connect("""Driver={SQL Server};Server=""" + servername + """;Database=""" + database + """;uid=USERNAME;pwd=PASSWORD""")

    cursor = connection.cursor()

    cursor.execute(query)

    connection.commit()

    connection.close()

【问题讨论】:

    标签: sql-server python-3.x tsql sqlalchemy pypyodbc


    【解决方案1】:

    根据 SQLAlchemy Docs 中的注释,这对我有用:

    sql_stmt = f"""EXECUTE sp_rename '{table2}', '{table1}';"""            
    
    with connection.begin() as conn:
         conn.execute(text(sql_stmt))
    

    【讨论】:

      【解决方案2】:

      好吧,伙计,你遇到了一些问题。

      1. pypyodbc 是您应该远离的东西。那个图书馆是 不久前风靡一时,但据我所知,它并没有得到很多 不再提交,谷歌正在远离它,在我的构建中我们移动了 出于多种原因远离它。持续时间很棒 但我认为它已经出局了。

      2. 您不能在查询中使用“GO”。 'GO' 不是 tsql 语句,它是一个 sqlcmd 命令 - 因此它不适用于 odbc。 'GO' 本质上只是将代码分成批次,所以要做到这一点,不使用 'GO' 你需要运行多个批次,例如:

        conn = engine.connect()
        tran = conn.transaction()
        conn.execute(f"EXECUTE sp_rename N'{OLD_TABLE_NAME}', N'{NEW_TABLE_NAME}', 'OBJECT'")
        conn.execute(f"ALTER TABLE {NEW_TABLE_NAME} SET LOCK_ESCALATION = TABLE")
        tran.commit()
        

      我相信这里还有更多内容,但希望这会让你继续前进。

      【讨论】:

      • tran = conn.transaction()导致错误TypeError: transaction() missing 1 required positional argument: 'callable_'
      • 您的引擎连接成功了吗?在这行之后conn = engine.connect() 试试conn.execute("SELECT 1") 那行是成功还是失败?
      • 输出是<sqlalchemy.engine.result.ResultProxy at 0xa987668>
      • 是因为我用的是sqlalchemy吗?这不是你期待的图书馆吗?此链接 (docs.sqlalchemy.org/en/latest/core/…) 建议 conn.transaction() 确实需要一个可调用的参数
      • 您的输出未显示“SELECT 1”的结果。 <sqlalchemy.engine.result.ResultProxy at 0xa987668 是当您引用一个方法或对象而不调用它时发生的情况。
      【解决方案3】:

      对于仍然想知道如何解决问题的人,我修复了 Jamie Marshall's answer 以使其适应新的 transaction api:

      conn = engine.connect()
      
      def rename(cnxn):
          rename_query = f"EXECUTE sp_rename N'{OLD_TABLE_NAME}', N'{NEW_TABLE_NAME}', 'OBJECT'"
          cnxn.execute(rename_query)
      
      conn.transaction(rename)
      

      【讨论】:

        猜你喜欢
        • 2014-08-01
        • 2017-07-21
        • 2015-01-29
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2010-09-07
        相关资源
        最近更新 更多