query(USER, PWD, DB, QUERY, Columns, Rows) :-
atom_concat('-p', PWD, PPWD),
process_create(path(mysql), ['-u', USER, PPWD, '-D', DB, '-e', QUERY], [stdout(pipe(Out)),stderr(std)]),
read_record(Out, Columns),
read_records(Out, Rows).
read_record(Out, Fields) :-
read_line_to_codes(Out, Codes),
Codes \= end_of_file,
atom_codes(Line, Codes),
atomic_list_concat(Fields, '\t', Line).
read_records(Out, [Record|Rs]) :-
read_record(Out, Record),
!, read_records(Out, Rs).
read_records(Out, []) :-
close(Out).
assertz(Clause).
答案 0 :(得分:1)
你真的没有多大意义。通过应用于数据库,我假设您有一系列基础事实,并且您希望这组谓词可以随之运行。
如果是这样,你需要阅读prolog中的统一。
答案 1 :(得分:1)
正如我在评论中所描述的,似乎很清楚USER
是您的数据库用户名,PWD
是用户的密码,DB
是数据库名称,{{1是您要执行的查询。 QUERY
是您要执行的完整MySQL查询字符串。有关查询的所有信息(包括哪些表,哪些字段和条件)都包含在该查询字符串中。它是一个标准的MySQL查询字符串。据了解,您提供的用户名和密码具有执行您在QUERY
中提供的查询的适当权限。
例如,假设您有一个名为QUERY
的MySQL数据库。
假设mydb
有一个名为mydb
的表,如下所示:
mytable
进一步假设用户id foo bar
-- --- ---
1 ick poo
2 oh yeah
可以使用密码mydb
访问您的MySQL数据库fred
。然后,您可以使用您显示的Prolog代码进行以下查询:
freds=password
将产生:
?- query('fred', 'freds=password', 'mydb', 'select * from mytable', Cols, Rows).
或者你可以这样做:
Cols = ['id', 'foo', 'bar']
Rows = [['1', 'ick', 'poo'], ['2', 'oh', 'yeah']]
将产生:
?- query('fred', 'freds=password', 'mydb', 'select id, bar from mytable limit 1', Cols, Rows).