Python sqlalchemy(postgresql)不返回实际表状态

Python sqlalchemy(postgresql)不返回实际表状态,python,postgresql,sqlalchemy,flask-sqlalchemy,database-trigger,Python,Postgresql,Sqlalchemy,Flask Sqlalchemy,Database Trigger,这是我问题的下一章 我将感谢任何进一步的帮助或想法 我在PostgreSQL上创建了这个函数 CREATE FUNCTION getSomeData() RETURNS trigger AS $$ import subprocess subprocess.call(['/path/to/your/virtual/environment/bin/python3', '/some_folder/some_sub_folder/get_data.py']) $$ LANGUAGE plpythonu

这是我问题的下一章

我将感谢任何进一步的帮助或想法

我在PostgreSQL上创建了这个函数

CREATE FUNCTION getSomeData()
RETURNS trigger
AS $$
import subprocess
subprocess.call(['/path/to/your/virtual/environment/bin/python3', '/some_folder/some_sub_folder/get_data.py'])
$$ 
LANGUAGE plpythonu;
触发

CREATE TRIGGER executePython 
AFTER INSERT OR UPDATE OR DELETE ON mysensor
FOR EACH ROW EXECUTE PROCEDURE callMyApp();
使用获取数据.py

from sqlalchemy import create_engine

SQLALCHEMY_DATABASE_URI = 'postgresql:///database_name'

db = create_engine(SQLALCHEMY_DATABASE_URI)
some_file = "my_file.txt"

#store pair of id and value
someDictionary = {}
with db.connect() as dbcon:
#Get sensor unique ID and room name for every room_id from mysensor existent in rooms
    mydata = dbcon.execute('SELECT mytable1.uid, mytable2.name FROM mytable1,mytable2 WHERE mytable1.some_id = mytable2.id')
    for row in mydata:
        # add key,value from touple to dictionary
        someDictionary[row[0]] = row[1]


f = open(config_file,"w")
#write section name in config file
f.write("[somepairing]\n")

for key, value in someDictionary.items():
    print(key, value)
    f.write(key + "=" +value+"\n")
f.close()
当我通过Postgresql触发器/函数运行此脚本时,我会在当前操作后一步获取数据

如果现在进行插入,脚本将不返回任何内容(假设我的表为空)。 如果我执行另一个操作,如insert、delete、update,我的脚本将记录第一次插入的数据,而不反映我当前的表内容,等等

示例

数据库状态

触发触发器后,脚本会得到什么

如果我单独运行这个python脚本,而不是通过触发器运行,那么一切都会正常,并获得确切的表状态

非常感谢你的帮助

我已经根据编辑了我的代码,现在我的函数就是这种形式

CREATE FUNCTION callMyApp()
RETURNS trigger
AS $$
import sys
sys.path.insert(0, '/path/to/my/module')
import get_config
return get_config.get_data()
$$ LANGUAGE plpythonu;
新的问题是在get_config中导入的模块无法识别/脚本不知道如何定位

Error: ERROR:  ImportError: No module named sqlalchemy
解决了这个问题。 我肯定有更好的方法来解决这个问题,但目前这是我所需要的

步骤1-创建函数

CREATE FUNCTION callMyApp()
RETURNS trigger
AS $$
import sys
sys.path.insert(0, '/path/to/my/module')
import my_module
myresult = plpy.execute('some_query_here',100)
list2=""
for i in range(len(myresult)):
    list2 = list2+ myresult[i]["some_table_row_here_returned_from_query"]+","
list3=""
for j in range(len(myresult)):
    list3 = list3+ myresult[j]["another_table_row_here_returned_from_query"]+","

return get_configV2.get_data(list2,list3)
$$ LANGUAGE plpythonu;
步骤2-创建触发器

CREATE TRIGGER executePython
AFTER INSERT OR UPDATE OR DELETE ON mysensor
EXECUTE PROCEDURE callMyApp();
步骤3-python脚本

def get_data(received1,received2):
    config_file = "/some/path/here/file.txt"
def convert(string):
    mylist = list(string.split(","))
    return mylist
f = open(config_file,"w")

#write section name in config file
f.write("Ziua buna din Braila!\n")

kkk = convert(received1)
ppp = convert(received2)
for i in range(len(kkk)):
    if (kkk[i] != ""):
        output = kkk[i]+"="+ppp[i]+"\n"
        f.write(output)
f.close()
希望能对您有所帮助,节省您的时间。 感谢您的支持

解决了这个问题。 我肯定有更好的方法来解决这个问题,但目前这是我所需要的

步骤1-创建函数

CREATE FUNCTION callMyApp()
RETURNS trigger
AS $$
import sys
sys.path.insert(0, '/path/to/my/module')
import my_module
myresult = plpy.execute('some_query_here',100)
list2=""
for i in range(len(myresult)):
    list2 = list2+ myresult[i]["some_table_row_here_returned_from_query"]+","
list3=""
for j in range(len(myresult)):
    list3 = list3+ myresult[j]["another_table_row_here_returned_from_query"]+","

return get_configV2.get_data(list2,list3)
$$ LANGUAGE plpythonu;
步骤2-创建触发器

CREATE TRIGGER executePython
AFTER INSERT OR UPDATE OR DELETE ON mysensor
EXECUTE PROCEDURE callMyApp();
步骤3-python脚本

def get_data(received1,received2):
    config_file = "/some/path/here/file.txt"
def convert(string):
    mylist = list(string.split(","))
    return mylist
f = open(config_file,"w")

#write section name in config file
f.write("Ziua buna din Braila!\n")

kkk = convert(received1)
ppp = convert(received2)
for i in range(len(kkk)):
    if (kkk[i] != ""):
        output = kkk[i]+"="+ppp[i]+"\n"
        f.write(output)
f.close()
希望能对您有所帮助,节省您的时间。
感谢您的支持

脚本使用自己的会话,因此事务处理。默认事务隔离级别为“已读已提交”。如果您希望能够在触发器中读取当前事务,我建议将
get_data
转到库中,并在触发器中使用它,将作为参数传递给函数。@IljaEverilä我已根据您的建议更新了代码。我已将脚本作为模块导入postgresql/plpythonu函数。创建函数callMyApp()将触发器返回为$$import sys.path.insert(0,/path/to/my/module')import get\u config return get\u config.get\u data()$$LANGUAGE plpythonu;我面临的另一个问题是无法识别module/python脚本请求的模块。这无法解决其他可能的env/module问题,但在本例中,我建议不要使用SQLA,而是使用提供给UDF的
plpy
模块,根据需要将其传递给库函数。您必须熟悉它,但它与用于Python的其他DB API没有太大区别。今天晚些时候,我将尝试给出一个正确的答案,而不仅仅是评论。脚本使用自己的会话,因此事务处理。默认事务隔离级别为“已读已提交”。如果您希望能够在触发器中读取当前事务,我建议将
get_data
转到库中,并在触发器中使用它,将作为参数传递给函数。@IljaEverilä我已根据您的建议更新了代码。我已将脚本作为模块导入postgresql/plpythonu函数。创建函数callMyApp()将触发器返回为$$import sys.path.insert(0,/path/to/my/module')import get\u config return get\u config.get\u data()$$LANGUAGE plpythonu;我面临的另一个问题是无法识别module/python脚本请求的模块。这无法解决其他可能的env/module问题,但在本例中,我建议不要使用SQLA,而是使用提供给UDF的
plpy
模块,根据需要将其传递给库函数。您必须熟悉它,但它与用于Python的其他DB API没有太大区别。今天晚些时候,我会尝试给出一个正确的答案,而不是仅仅是评论。