【问题标题】:SQLAlchemy TypeError: __init__() got multiple values for argument 'name'SQLAlchemy TypeError:__init__() 为参数“名称”获取了多个值
【发布时间】:2020-01-18 16:34:14
【问题描述】:

当我尝试为给定表定义唯一性约束和索引时,我在 SQL Alchemy 中遇到了一个奇怪的错误。

from sqlalchemy.sql import func
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, BigInteger, \
    String, Numeric, DateTime, Boolean
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.schema import Index, UniqueConstraint
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import sqlalchemy


Base = declarative_base()

class CommonColumns(object):

    id = Column(Integer,
        primary_key=True,
        autoincrement=True
    )
    created_at = Column(
        DateTime,
        server_default=func.now()
    )
    updated_at = Column(
        DateTime,
        server_default=func.now(),
        server_onupdate=func.now()
    )

class Example(CommonColumns, Base):

    __tablename__ = 'encoding'

    model_name = Column(String)
    model_version = Column(String)
    product_id = Column(BigInteger)
    position = Column(Integer)
    file_name = Column(String)
    image_type = Column(String)
    encoding = Column(ARRAY(Numeric))
    sku = Column(String)

    __table_args__ = (
        UniqueConstraint(
            model_name,
            model_version,
            product_id,
            position,
            file_name,
            image_type,
            name='example_unique'
        ),
        Index(
            model_name,
            model_version,
            product_id,
            position,
            file_name,
            image_type,
            name='example_index'
        ),
        {}
    )


connection_string = sqlalchemy.engine.url.URL(
    drivername='<removed>',
    username='<removed>',
    password='<removed>',
    database='<removed>',
    host='<removed>'
)
engine = create_engine(connection_string)
Session = sessionmaker(bind=engine)
session = Session()

Base.metadata.create_all(engine)
session.commit()

此代码导致以下错误:

Traceback(最近一次调用最后一次): 文件“/Users/ryan.zotti/Documents/repos/recommendations/name_example.py”,第 30 行,在 类示例(CommonColumns,基础): 示例中的文件“/Users/ryan.zotti/Documents/repos/recommendations/name_example.py”,第 60 行 名称='编码索引' TypeError: init() 为参数 'name' 获得了多个值

为什么会发生名称冲突?我分别为UniqueConstraintIndex 定义name

我正在使用 SQLAlchemy==1.3.8 和 Postgres 9.5。

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

    碰撞发生在model_namename="example_index" 之间。 Index __init__ 方法的第一个参数是名称,所以试试这个:

    Index(
        "example_index",
        model_name,
        model_version,
        product_id,
        position,
        file_name,
        image_type
    )
    

    发件人:https://docs.sqlalchemy.org/en/13/core/constraints.html#sqlalchemy.schema.Index

    【讨论】:

    • 我认为您可能已经接近了,但是当我添加时,我得到 KeyError: 'example_index' 作为错误。
    • “示例索引”后是否加了逗号?
    猜你喜欢
    • 2018-10-18
    • 1970-01-01
    • 2022-11-17
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多