如何将SqlServer中的ON [PRIMARY]转换为Sqlalchemy模型?
如何将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来翻译上述查询。
问题的原因是因为大多数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语句是否符合预期。