2016-04-06 29 views
-3
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

這顯然是爲MySQL編寫的數據庫。你的數據庫是MySQL嗎?看起來很清楚,「USER」是你的db用戶名,「PWD」是用戶的密碼,「DB」是數據庫名,「QUERY」是你想要執行的查詢。你還需要知道爲了嘗試它嗎?這個聲明「assertz(Clause).'本身,在這裏的任何其他語境是沒有意義的。 – lurker

+0

在哪裏放表的名稱和列的名稱? – AAAA

+0

它全部內置到查詢字符串中。這裏的「QUERY」是一個MySQL查詢。這就是你展示的代碼的結構。 – lurker

回答

1

你沒有太多道理。通過應用數據庫,我假設你有一系列基礎事實,並且你希望這個謂詞集可以與它一起運行。

如果是這樣,您需要閱讀關於序言的統一。

1

正如我在我的評論描述,它似乎很清楚,USER是你的數據庫的用戶名,PWD是用戶的密碼,DB是數據庫名,QUERY是要執行查詢。 QUERY是您要執行的完整MySQL查詢字符串。有關查詢的所有信息(包括哪些表,哪些字段和條件)都包含在該查詢字符串中。這是一個標準的MySQL查詢字符串。據瞭解,您提供的用戶名和密碼有適當的權限來執行您將在QUERY中提供的查詢。

例如,假設您有一個名爲mydb的MySQL數據庫。也 假設mydb有一個表叫mytable看起來像這樣:

id foo bar 
-- --- --- 
1 ick poo 
2 oh  yeah 

並進一步假設你的MySQL數據庫mydb是通俗易懂的用戶fred與密碼,freds=password。然後你就可以用你表示Prolog的代碼下面的查詢:

?- 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). 

這將產生:

Cols = ['id', 'bar'] 
Rows = [['1', 'poo']] 
相關問題