![](/img/trans.png)
[英]Python SQLAlchemy and Postgres - How to query a JSON element
[英]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.