ArgumentError: Mapper mapped class Users->users could not assemble any primary key columns for mapped table 'users'

ArgumentError: Mapper mapped class Users->users could not assemble any primary key columns for mapped table 'users'

我是 SQLAlchemy 的新手。尝试在 Heroku Postgres 中构建数据库

获取错误: A​​rgumentError: Mapper mapped class Users->users could not assemble any primary key columns for mapped table 'users'

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import (Column, Integer, BigInteger, String, Sequence, TIMESTAMP, Boolean, JSON)
from sqlalchemy import sql
from sqlalchemy import Table, Column, Integer, String, MetaData, Sequence, create_engine
class Users(Base):

    __tablename__ = 'users'
    
    meta = MetaData()
    
    users_table = Table(
    'users', meta,
    Column('id', Integer, primary_key=True),
    Column('name',String(50)),
    Column('fullname',String(50)),
    Column('phone',Integer),
               )
       
    meta.create_all(engine)

    def __repr__(self):
        return "<User(id='{}', fullname='{}', username='{}')>".format(
            self.id, self.full_name, self.username)

这不起作用的主要原因是您尝试在创建 class User 之前创建 table 并且您声明的 table 不是在正确的属性上声明。所以 sqlalchemy 找不到 id 列。 我试图在下面概述一个更惯用的声明方法:


# This implicitly creates metadata, you do not need to make an explicit one.
Base = declarative_base()

class Users(Base):

    __tablename__ = 'users'
    
    # Using a table explicitly is not required here
    # Just declare the columns as properties.
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    phone = Column(Integer)
       
    # Don't do this here because Users is not done 
    # meta.create_all(engine)

    def __repr__(self):
        return "<User(id='{}', fullname='{}', username='{}')>".format(
            self.id, self.full_name, self.username)

# Do this after classes are declared and use Base's metadata.
Base.metadata.create_all(engine)

参考文献:

如果你真的想设置一个 table 你必须用 __table__ 设置它并使用 Base.metadata: https://docs.sqlalchemy.org/en/13/orm/extensions/declarative/table_config.html#using-a-hybrid-approach-with-table