Выполнить команду SQL sp_rename с помощью pypyodbc - PullRequest
0 голосов
/ 04 марта 2019

Изначально я использовал следующую команду для переименования таблиц SQL:

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

Однако это вызвало ошибку «Превышено время ожидания запроса блокировки», которая, по-моему, произошла из-за отсутствия коммита"в конце запроса (хотя я не уверен в этом).

Поэтому вместо этого я принял новый запрос (адаптированный с этот вопрос ).

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

1 Ответ

0 голосов
/ 23 марта 2019

Хорошо, чувак, у тебя тут несколько проблем.

  1. pypyodbc - это то, от чего тебе следует отказаться.Эта библиотека была в моде некоторое время назад, но, насколько мне известно, она не получает больше коммитов, Google отходит от нее, в моей сборке мы отошли от нее по ряду причин.Это было здорово, хотя это продолжалось, но я думаю, что оно вышло.

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

Я уверен, что естьи здесь происходит больше, но, надеюсь, это поможет вам.

...