小编Mar*_*ton的帖子

在创建触发器时 FUNCTION 处或附近的 PostgreSQL 语法错误

我在运行 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();

我希望触发器函数可以工作,但它会引发语法错误。

postgresql database-trigger

6
推荐指数
1
解决办法
2469
查看次数

SQLAlchemy 视图处理

请告诉我如何以与在 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)

python postgresql sqlalchemy

3
推荐指数
2
解决办法
4109
查看次数

SQLAlchemy无法在更新值时设置属性错误

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。我怎样才能做到这一点?我确信这肯定是一个非常简单的问题,但是对于我一生来说,我看不到这个问题。

非常感谢。

python postgresql sqlalchemy

1
推荐指数
1
解决办法
1343
查看次数

标签 统计

postgresql ×3

python ×2

sqlalchemy ×2

database-trigger ×1