Python sqlalchemy (postgresql) 没有返回真正的 table 状态
Python sqlalchemy (postgresql) not returning real table state
这是我问题的下一章 。
如果有任何进一步的帮助或想法,我将不胜感激。
我已经在 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 trigger/function 这个脚本时,我得到的数据比我当前的操作晚了一步。
如果我现在插入,我的脚本将 return 什么都没有(假设我的 table 是空的)。
如果我执行另一个操作,如插入、删除、更新,我的脚本将记录我第一次插入的数据,而不反映我当前的 table 内容,等等。
例子
数据库状态
触发触发器后我的脚本得到了什么
如果我单独 运行 这个 python 脚本,而不是通过触发器,一切都很好并获得准确的 table 状态。
非常感谢您的帮助。
我已经编辑了我的代码,现在我的函数就是那种形式
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()
希望对您有所帮助并节省您的时间。
感谢您的支持 Ilja Everilä
这是我问题的下一章
如果有任何进一步的帮助或想法,我将不胜感激。
我已经在 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 trigger/function 这个脚本时,我得到的数据比我当前的操作晚了一步。
如果我现在插入,我的脚本将 return 什么都没有(假设我的 table 是空的)。 如果我执行另一个操作,如插入、删除、更新,我的脚本将记录我第一次插入的数据,而不反映我当前的 table 内容,等等。
例子
数据库状态
触发触发器后我的脚本得到了什么
如果我单独 运行 这个 python 脚本,而不是通过触发器,一切都很好并获得准确的 table 状态。
非常感谢您的帮助。
我已经编辑了我的代码,现在我的函数就是那种形式
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()
希望对您有所帮助并节省您的时间。 感谢您的支持 Ilja Everilä