如何将SqlServer中的ON [PRIMARY]转换为Sqlalchemy模型?

20 浏览
0 Comments

如何将SqlServer中的ON [PRIMARY]转换为Sqlalchemy模型?

我在sqlserver中有一个查询,我想使用sqlalchemy orm编写一个对应的模型。我需要知道如何将"ON [PRIMARY]"转换为sqlalchemy的语法。

以下是我的查询:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[UserModel](
[userid] [nvarchar](255) NULL,
[username] [nvarchar](255) NULL,
[serialnumber] [nvarchar](255) NULL
) ON [PRIMARY]
GO

以下是我的模型:

class UserModel(db.Model):
    __tablename__ = 'UserModel'
    userid = Column('userid', Unicode(255))
    username = Column('username', Unicode(255))
    serialnumber = Column('serialnumber', Unicode(255))

有什么建议,我该如何实现这个?

目前我遇到了以下错误:

sqlalchemy.exc.ArgumentError: Mapper Mapper|UserModel|UserModel could not assemble any primary key columns for mapped table 'UserModel'

我知道我的模型中没有定义主键,但上述查询正常工作。所以我想用sqlalchemy orm来翻译上述查询。

0
0 Comments

问题的原因是因为大多数ORM无法直接将SqlServer上的[PRIMARY]语法转换为Sqlalchemy模型,因为ORM期望Python对象与数据库中的唯一可识别行相对应。解决方法是可以指示Sqlalchemy使用唯一标识行作为"主键",并且可以通过增加自定义的mssql方言参数来定义表应存储在的文件组。

具体的解决方法如下:

1. 在Sqlalchemy模型定义中,指定某个字段作为主键:

class UserModel(db.Model):
    __tablename__ = 'UserModel'
    userid = Column('userid', Unicode(255))
    username = Column('username', Unicode(255))
    serialnumber = Column('serialnumber', Unicode(255))
    __mapper_args__ = {
        'primary_key': [userid]
    }

2. 增加自定义的mssql方言参数:

from sqlalchemy import Table
from sqlalchemy.schema import CreateTable
from sqlalchemy.ext.compiler import compiles
# 添加自定义方言参数
Table.argument_for('mssql', 'on', None)
@compiles(CreateTable, 'mssql')
def compile_create_table(create, compiler, **kw):
    stmt = compiler.visit_create_table(create, **kw)
    filegroup = create.element.kwargs.get('mssql_on')
    if filegroup:
        stmt = stmt.rstrip()  # 美化输出,移除换行符
        filegroup = compiler.preparer.quote(filegroup)
        stmt = f"{stmt} ON {filegroup}\n\n"
    return stmt

3. 在模型定义中添加必要的表参数:

class UserModel(db.Model):
    ...
    __table_args__ = {
        'mssql_on': 'PRIMARY'
    }

通过以上方法,可以将SqlServer上的[PRIMARY]语法转换为Sqlalchemy模型,并且可以验证生成的DDL语句是否符合预期。

0