我在运行 Ubuntu 服务器 18.04 的新机器上安装了 postgresql 和 postgresql-plpython-10(使用 apt),并且我已经将 Postgresql 数据库(使用 提取pg_dumpall)从另一台机器恢复到新机器(Linux)上。
我检查了数据库中存在trackspreadsheetnztplpy函数并且存在表nztgsheet。我在旧机器上重新运行了这个功能,它运行得很好。我查plpythonu安装使用psql的命令在新机器上:\dL。
SQL 错误:
错误:“FUNCTION”第 1 行或附近的语法错误:...H ROW WHEN (OLD.* IS DISTINCT FROM NEW.*) EXECUTE FUNCTION t... ^
在声明中:
CREATE TRIGGER trackspreadsheetnzt AFTER UPDATE ON nztgsheet FOR EACH ROW WHEN (OLD.* IS DISTINCT FROM NEW.*) EXECUTE FUNCTION trackspreadsheetnztplpy();
我希望触发器函数可以工作,但它会引发语法错误。
请告诉我如何以与在 TABLE 上使用 SQLAlchemy 的方式类似的方式从 VIEW 中选择和操作行。
如果 name_address_vw 是一个表(引擎已经使用 JDBC Psycopg2 设置到 PostgreSQL 数据库并且未显示),我将如何执行查询:
meta = MetaData(Engine,reflect=True)
nav = meta.tables['name_address_vw']
Session = sessionmaker(bind=engine)
session = Session()
navRow = session.query(
nav
).filter(
nav.c.address.like("%pad%")
).first()
print (navRow.name)
Run Code Online (Sandbox Code Playgroud)
SQLAlchemy 失败,因为 name_address_vw 不是 meta.tables 的关键成员我明白这是因为它是一个视图,而不是一个表。
以下是用于设置和填充后端 PostgreSQL 的 SQL 语句:
CREATE TABLE name
(
id SERIAL PRIMARY KEY,
name VARCHAR NOT NULL
);
CREATE TABLE address
(
id SERIAL PRIMARY KEY,
idA INTEGER REFERENCES name(id),
address VARCHAR
);
CREATE VIEW name_address_vw AS SELECT …Run Code Online (Sandbox Code Playgroud) 我mailtable在后端PostgreSQL数据库中有一个表,并且正在使用SQLAlchemy ORM使用给定的查询它mailId。对于以下代码,amEngine已经设置了。当到达该mailRow.usercomment = 'Hello World'行时,它抛出:
AttributeError:无法设置属性
Base = declarative_base()
Base.metadata.reflect(amEngine)
metaAm = MetaData()
metaAm.reflect(bind=amEngine)
mt = metaAm.tables['mailtable']
Session = sessionmaker(bind=amEngine)
amSession = Session()
mailRow = amSession.query(
mt
).filter(
mt.c.id == mailId
).first()
mailAddress = mailRow.address
mailRow.usercomment = 'Hello World'
amSession.flush()
amSession.commit()
Run Code Online (Sandbox Code Playgroud)
我需要阅读该address列(成功)并更新该usercomment列(引发异常)。两列的PostgreSQL类型均为text。我怎样才能做到这一点?我确信这肯定是一个非常简单的问题,但是对于我一生来说,我看不到这个问题。
非常感谢。