Рубрики
Без рубрики

SQLalchemy ProgrammingError 42000 и MS SQL

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Я работал над сценарием инвентаризации программного обеспечения в последнее время с использованием SQLALCHEMY на Windows XP для подключения к вновь созданной таблице в базе данных Microsoft SQL Server 2005. Я создал таблицу, используя Aqua Data Studio, входящую в систему как администратор SQL (SA) и мысль все было хорошо, пока не пытался совершить некоторые данные в таблицу. Вот вкусная ошибка, которую я получил:

pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot find the object "dbo.software" because it does not exist or you do not have permissions. (1088) (SQLExecDirectW)')

Теперь, что это значит? Я знаю, что база данных существует, потому что я только что создал его с AQUA Data Studio (Suite Management Management), и я дал себе следующие разрешения: выберите, вставить, обновлять и удалять. Если вы поглажете эту ошибку, вы получите четыре ссылки на один нить Отказ У них на самом деле у них нет решения в потоке, хотя они упоминают, что добавление разрешения на изменение схемы может работать. Обратите внимание, что эта проблема происходит только при использовании декларативного синтаксиса. Во всяком случае, на данный момент вы, вероятно, хотите увидеть мой код, так что посмотрите:

from sqlalchemy import create_engine, Column, DateTime, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import datetime

uri = "mssql://username:pw@mssqlServerPath/Inventory"
engine = create_engine(uri)
engine.echo = True
Base = declarative_base(engine)

########################################################################
class Software(Base):
    """
    SqlAlchemy table representation of "software" login
    """
    __tablename__ = "software"
    __table_args__ = {"schema":"dbo"}
    
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(100))
    date_added = Column(DateTime)
    date_checked = Column(DateTime)
    machine_name = Column(String(25))
    version = Column(String(25))
    
    #----------------------------------------------------------------------
    def __init__(self, name, date_added, date_checked, machine_name, version):
        """"""
        self.name = name
        self.date_added = date_added
        self.date_checked = date_checked
        self.machine_name = machine_name
        self.version = version
        
Session = sessionmaker(bind=engine)
session = Session()
now = datetime.datetime.now()
new_record = Software("Adobe Acrobat", now, now, "MCIS0467", "9.0")
session.add(new_record)
session.commit()

Из того, что мой босс мог выяснить, декларативный синтаксис с использованием системы запросов на основе идентичности, и если идентификация не установлена, то SQLalchemy не может найти базу данных. Если вы используете SQLALCHEMY, чтобы создать таблицу, то у вас не будет этой проблемы. В любом случае, оказывается, что вы должны использовать Microsoft SQL Server Management Studio для устранения этой конкретной ситуации. Загрузите его и перейдите к правильной базе данных и таблице, затем откройте дерево столбцов. Щелкните правой кнопкой мыши поле первичного ключа и выберите «Изменить». В нижней части экрана находится вкладка «Свойства столбцов». Идите туда и прокрутите вниз до спецификации идентичности и расширите его. Наконец, убедитесь, что поле «(Identity)» установлено значение «Да». Сохраните это, и вы закончите!

Это довольно странная и редкая проблема, поэтому у вас, вероятно, не будет этого, но я думал, что это интересная проблема, и я хотел документировать решение. Примечание. Я использовал Python 2.5 с SQLALCHEMY 0.6.6 на Windows XP.