我在Company和Element之间有一个一对多的表关系,我认为我已经正确地定义了它们

class Base(MappedAsDataclass, DeclarativeBase):
    pass
class Company(Base):
    __tablename__ = "company"
    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    name: Mapped[str] = mapped_column(String(30))
    url: Mapped[str] = mapped_column(String(50))
    stype: Mapped[str] = mapped_column(String(10))
    elements: Mapped[List["Element"]] = relationship()

    def __repr__(self):
        return f"<Company(name={self.name!r})>"


class Element(Base):
    __tablename__ = "element"
    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    element: Mapped[str] = mapped_column(String(50))
    company_id: Mapped[int] = mapped_column(ForeignKey("company.id"))
    company: Mapped["Company"] = relationship(back_populates="elements")

但是,当我try 用

company = Company(name=df['name'][index], url=df['url'][index], stype=df['stype'][index])

我听到翻译抱怨我错过了公司和身份证明.我的理解是,两者都不需要明确定义

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2023.2.3\plugins\python-ce\helpers\pydev\pydevd.py", line 1500, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2023.2.3\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "F:\Onedrive\8. Coding\Python\pvp\database\model.py", line 67, in <module>
    main()
  File "F:\Onedrive\8. Coding\Python\pvp\database\model.py", line 63, in main
    insert_companies()
  File "F:\Onedrive\8. Coding\Python\pvp\database\model.py", line 55, in insert_companies
    company = Company(name=df['name'][index], url=df['url'][index], stype=df['stype'][index])
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: __init__() missing 2 required positional arguments: 'id' and 'elements'
python-BaseException

Process finished with exit code -1073741510 (0xC000013A: interrupted by Ctrl+C)

完整的代码(我应该已经开始了……)

from typing import List

import pandas as pd
from sqlalchemy import (
    create_engine,
    Column, String, Float, Integer,
    ForeignKey
)
from sqlalchemy.orm import Mapped, mapped_column, relationship, DeclarativeBase, MappedAsDataclass
from sqlalchemy.orm import sessionmaker

engine = create_engine("mariadb+mariadbconnector://dkhokhar:1286Qyts@gd2-dbmain-service:3306/pvp")
session_factory = sessionmaker(bind=engine)


class Base(MappedAsDataclass, DeclarativeBase):
    pass


class Company(Base):
    __tablename__ = "company"
    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True, init=False)
    name: Mapped[str] = mapped_column(String(30))
    url: Mapped[str] = mapped_column(String(50))
    stype: Mapped[str] = mapped_column(String(10))
    elements: Mapped[List["Element"]] = relationship()

    def __repr__(self):
        return f"<Company(name={self.name!r})>"


class Element(Base):
    __tablename__ = "element"
    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    element: Mapped[str] = mapped_column(String(50))
    company_id: Mapped[int] = mapped_column(ForeignKey("company.id"))
    company: Mapped["Company"] = relationship(back_populates="elements")


class ItemPrice(Base):
    __tablename__ = "item_price"
    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    name: Mapped[str] = mapped_column(String(50))
    price: Mapped[float]
    company_id: Mapped[int] = mapped_column(ForeignKey("company.id"))


def insert_companies():
    print("Reading csv: pvp_init.csv")
    df = pd.read_csv("../data/pvp_dbinit.csv")
    print("Populating Company table..")
    for index in df.index:
        # [''] = column [index] = row for 2d array
        print(f"{df['name'][index]} {df['url'][index]} {df['stype'][index]}")

        company = Company(name=df['name'][index], url=df['url'][index], stype=df['stype'][index])
        with session_factory.begin() as sess:
            sess.merge(company)


def main():
    with engine.begin() as conn:
        Base.metadata.create_all(conn)
    insert_companies()


if __name__ == "__main__":
    main()

推荐答案

documentation人开始:

init,如map_Column.init,relationship.init,如果为False,则表示该字段不应是init()方法的一部分

您应该将不是构造函数一部分的所有字段设置为init=False:

class Company(Base):
    __tablename__ = "company"
    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True, init=False)  # <- HERE
    name: Mapped[str] = mapped_column(String(30))
    url: Mapped[str] = mapped_column(String(50))
    stype: Mapped[str] = mapped_column(String(10))
    elements: Mapped[List["Element"]] = relationship(init=False)  # <- HERE

    def __repr__(self):
        return f"<Company(name={self.name!r})>"

编辑:如果不需要使用dataclass,也可以从Base类声明中删除MappedAsDataclass:

class Base(DeclarativeBase):
    pass

class Company(Base):
    __tablename__ = "company"
    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
    name: Mapped[str] = mapped_column(String(30))
    url: Mapped[str] = mapped_column(String(50))
    stype: Mapped[str] = mapped_column(String(10))
    elements: Mapped[List["Element"]] = relationship()

    def __repr__(self):
        return f"<Company(name={self.name!r})>"

Python相关问答推荐

如何在__init__.py中调整我的外部自定义库导入?

为什么判断pd.DataFrame的值与判断pd.Series的值存在差异(如果索引中有值)?

用ctype构建指针链

根据多列和一些条件创建新列

是否有方法将现有的X-Y图转换为X-Y-Y1图(以重新填充)?

如何知道标志是否由用户传递或具有默认值?

了解shuffle在NP.random.Generator.choice()中的作用

Python:记录而不是在文件中写入询问在多文件项目中记录的最佳实践

NumPy中的右矩阵划分,还有比NP.linalg.inv()更好的方法吗?

如何根据情况丢弃大Pandas 的前n行,使大Pandas 的其余部分完好无损

如何用symy更新分段函数

跟踪我已从数组中 Select 的样本的最有效方法

Python中使用时区感知日期时间对象进行时间算术的Incredit

当密钥是复合且唯一时,Pandas合并抱怨标签不唯一

使用LineConnection动画1D数据

大Pandas 胚胎中产生组合

pandas DataFrame GroupBy.diff函数的意外输出

在Wayland上使用setCellWidget时,try 编辑QTable Widget中的单元格时,PyQt 6崩溃

删除字符串中第一次出现单词后的所有内容

调用decorator返回原始函数的输出