geekdoc-python-zh/docs/pythonlibrary/sqlalchemy-programmingerror...

3.5 KiB

SqlAlchemy 编程错误 42000 和 MS SQL

原文:https://www.blog.pythonlibrary.org/2011/01/15/sqlalchemy-programmingerror-42000-and-ms-sql/

我最近一直在使用 Windows XP 上的 SqlAlchemy 编写软件清单脚本,以连接到 Microsoft SQL Server 2005 数据库中新创建的表。我使用 Aqua Data Studio 创建了这个表,以 SQL Administrator (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(一个数据库管理套件)创建了它,我给了自己以下权限:选择、插入、更新和删除。如果你用谷歌搜索这个错误,你会发现对一个线程的四个引用。他们在线程中没有真正的解决方案,尽管他们提到添加权限来改变模式可能会起作用。请注意,只有在使用声明性语法时,这个问题才会发生。无论如何,在这一点上,你可能想看我的代码,所以看一看:


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 来纠正这种特殊情况。加载它并导航到正确的数据库和表,然后打开 columns 树。右键单击主键字段,然后选择“修改”。在屏幕底部有一个“列属性”标签。转到那里,向下滚动到 Identity Specification 并展开。最后,确保“(Is Identity)”字段设置为“是”。保存它,你就完成了!

这是一个非常奇怪和罕见的问题,所以你可能不会有它,但我认为这是一个有趣的问题,我想记录解决方案。注意:我在 Windows XP 上使用 Python 2.5 和 SqlAlchemy 0.6.6。