Python sqlalchemy (postgresql) 不返回真实的表状态。

问题描述 投票:1回答:1

这是我的问题的下一章,当 从PostgreSQL函数运行python脚本.

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

我已经在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();

随着 get_data.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触发函数运行这个脚本时,我得到的数据比我当前的操作晚了一步。

如果我现在插入一个数据,我的脚本将什么都不返回(假设我的表是空的).如果我进行另一个操作,比如插入,删除,更新,我的脚本将记录我第一次插入的数据,而不是反映我当前表的内容,等等。

例子:如果我做了另一个动作,如插入、删除、更新,我的脚本将记录第一次插入的数据,而不能反映当前表的内容,等等。

数据库状态real table state

在触发器被触发后,我的脚本得到了什么? what I get

如果我单独运行这个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
python postgresql sqlalchemy flask-sqlalchemy database-trigger
1个回答
0
投票

我相信有更好的方法来解决这个问题,但目前我只需要这样做。

步骤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_querry"]+","
list3=""
for j in range(len(myresult)):
    list3 = list3+ myresult[j]["another_table_row_here_returned_from_querry"]+","

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()

希望对您有所帮助,节省您的时间,谢谢您的支持。 Ilja Everilä

© www.soinside.com 2019 - 2024. All rights reserved.