繁体   English   中英

难以理解如何在 sqlalchemy python 和 postgres 中添加一行

[英]Stumped on how to add a row in sqlalchemy python and postgres

我有一个如下定义的表,可以使用此模式从数据库中读取并创建缺失的表。 不知道如何向数据库添加行:

from sqlalchemy import create_engine, select, table, inspect, MetaData
from sqlalchemy import Column, Integer, String, LargeBinary, Text, \
                       ForeignKey, Table, Boolean, JSON
from sqlalchemy.orm import sessionmaker, registry, relationship
from sqlalchemy.ext.declarative import declarative_base

Base     = declarative_base()
engine   = create_engine(STR_CONN) #, echo=True)
metadata = MetaData(engine)
Session  = sessionmaker(bind=engine)
session  = Session()

@mapper_registry.mapped
@dataclass
class UsersTbl():
    __table__ = Table(
    "users",
    metadata,
    Column("email_address", String, primary_key=True),
    Column("saved_state", JSON),
    )

    email_address: str   = None
    saved_state: str     = None
    lookupcolumn: Column = __table__.columns['email_address']

...

metadata.create_all(engine)

如果需要,创建缺失的表

...

sql = select(table.__table__).where(table.lookupcolumn == lookupkey)

with engine.connect() as conn:
    dbdata = conn.execute(sql).all()

按预期返回一行

但是当我尝试如下添加一行时

entry = UsersTbl("blah@blah.com", "{}")
session.add(entry)
session.commit()

我收到一个错误
"""ProgrammingError: (psycopg2.errors.UndefinedTable) 对表“users”的 FROM 子句条目的无效引用 LINE 1: ...T INTO users (email_address, saved_state) VALUES (users.emai ... ^ HINT: There是表“用户”的条目,但不能从查询的这一部分引用。

[SQL: INSERT INTO users (email_address, saved_state) VALUES (users.email_address, %(saved_state)s) RETURNING users.email_address] [parameters: {'saved_state': '"{}"'}] (此错误的背景在: https://sqlalche.me/e/14/f405 )"""

令人沮丧的是,我可以使用以下方法来处理发布数据,但似乎无法让它自动工作,如上创建丢失的表或检索数据:(感谢任何帮助!

class User2(Base):
    __tablename__ = 'users'

    email_address = Column("email_address", String, primary_key=True)
    saved_state = Column("saved_state", String)

    def __init__(self, email_address=None, saved_state=None):
        self.email_address = email_address
        self.saved_state = saved_state


entry = User2("blah@blah.com2", "{}")
session.add(entry)
session.commit()

任何帮助将不胜感激

stmt = insert(Tables.UsersTbl).values(('spongebob2d', "Spongebob Squarepants"))
with engine.connect() as conn:
    result = conn.execute(stmt)

成功了:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM