[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Artanis] Foreign Key for Migrations

From: Nala Ginrut
Subject: Re: [Artanis] Foreign Key for Migrations
Date: Sun, 24 Mar 2019 14:46:25 +0800
User-agent: mu4e 1.0; emacs 25.1.1

Hi Jonathan!

Jonathan Schmeling writes:

> In the mean time, what is the difference between the migration and
> models since I have a feeling I don't fully understand. Is it just that
> models will handle creating the tables, now, rather than migrations but
> migrations are still useful for creating dummy/test data in the tables?

Actually, migration and models are sharing the same implemtation
mechanism in the low-level. But there're 2 differences:
1. They're slightly different in syntax, migration doesn't use macros of
Scheme, so you have to add quote-sign "'" explicitly. This is trivial.

2. They're different for the purpose. Migration is a tool to migrate DB
data, or easily handling when you're still designing your tables. You
may change the definition as you wish, and run it arbitrarily. The
tables in migration will not be recognized by Artanis, it's just for
creating/dropping or transferring data.

Models are the mapping to the existing tables after you confirmed your
design. And should be cautiously changed, because I will add
verification mechanism in the future. That is to say, the definition
that you put in model will be recognized by Artanis. If you've defined a
table in model, it will be created if it doesn't exist yet, but if it
exists, Artanis will verify its schema with your definition to make
sure that the table you want.

Best regards.

> Jonathan
> On 3/18/19 12:53 PM, Nala Ginrut wrote:
>> Jonathan Schmeling writes:
>>> web_1  | app/models/PEOPLE.scm:4:0: In procedure module-lookup: Unbound 
>>> variable: PEOPLE
>> For this issue, please update to the latest commit, I just fixed few
>> hours ago. However, you shouldn't encounter this issue since I've told
>> you to define the people table in app/models/PEOPLE.scm.
>> So even after fix, it will throw an error to force you define PEOPLE.
>> PS: Define it in the migration is useless here, since migration and
>> model are different things.
>>> web_1  | Backtrace:
>>> web_1  |            0 (primitive-load "/myapp/app/controllers/#{}#.scm")
>>> web_1  |
>>> web_1  | ERROR: In procedure primitive-load:
>>> web_1  | In procedure open-file: No such file or directory: 
>>> "/myapp/app/controllers/#{}#.scm"
>> This issue is unrelated to models, it means you've created a controller
>> whose name is a null string. I don't know how you made it, but you need to
>> check your code.
>>> But I'm not certain what to make of this error, unfortunately.
>>> Jonathan
>>> On Sunday, March 17, 2019, 2:49:49 PM CDT, Nala Ginrut <address@hidden> 
>>> wrote:
>>> Hi Jonathan!
>>> I've realized that there's bug in models after I fixed some bugs in
>>> migration before.
>>> Now I think it's fixed in a88c7e189a6a6273399e6e713be407ef55938f65
>>> Please notice that you're forced to define the table in
>>> define-artanis-model from now on, if you just leave it as
>>> (define-artanis-model people) after drawing a model, then
>>> art command will throw error.
>>> Here's an example:
>>> ----------------code------------------
>>> (create-artanis-model
>>> people
>>> (id auto (#:not-null #:primary-key))
>>> (first_name char-field (#:maxlen 30 #:not-null))
>>> (last_name char-field (#:maxlen 30 #:not-null)))
>>> ----------------end-------------------
>>> And another notion is that the syntax is slightly different from the
>>> mogration, in migration, you should use symbol explicitly:
>>> -----------------code---------------------
>>> (create-table
>>> 'people
>>> '(id auto (#:not-null #:primary-key))
>>> '(first_name char-field (#:maxlen 30 #:not-null))
>>> '(last_name char-field (#:maxlen 30 #:not-null)))
>>> -----------------end----------------------
>>> But in Models, the list is quasiquote, so you can use unquote-sign, say
>>> "," to escape the content if you like.
>>> Please try it, and don't hasitate to report bugs. ;-)
>>> Thanks!
>>> Jonathan Schmeling writes:
>>>> Thanks so much for the response! Ahhh; I did wonder if Artanis had 
>>>> anything had anything like that. That is really nice to work with.
>>>> So I have a table named PEOPLE; so I ran art draw model PEOPLE and that 
>>>> reated a file named PEOPLE.scm which contains
>>>> ;; Model PEOPLE definition of myapp
>>>> ;; Please add your license header here.
>>>> ;; This file is generated automatically by GNU Artanis.
>>>> (create-artanis-model PEOPLE) ; DO NOT REMOVE THIS LINE!!!
>>>> I then added to one of my controllers (use-modules (app models PEOPLE)) 
>>>> and running Artanis and visiting endpoints in that controller didn't throw 
>>>> any errors.
>>>> So then I added a call similar to the one you had that uses ($PEOPLE …) in 
>>>> the controller; however, then I get the error In procedure module-lookup: 
>>>> Unbound variable: $PEOPLE when I visit the endpoint that uses the function 
>>>> call.
>>>> Did I miss something?
>>>> Jonathan
>>>> On Saturday, March 16, 2019, 3:31:19 PM CDT, Nala Ginrut 
>>>> <address@hidden<mailto:address@hidden>> wrote:
>>>> Hi Jonathan!
>>>> Sorry it's my mistake to neglect this part in the doc.
>>>> You don't have to take care of the DB connection management by
>>>> yourself. You may just use `art draw model person' to create the named
>>>> mapping to the "person" table, and there's an exported relational
>>>> mapping object named "$person", you may import (app models person) in
>>>> other controller to use it. It's based on FPRM, but the table name has
>>>> already been wrapped into the closure:
>>>> And maybe read its implementation is clearer to you:
>>>> The usage should look like this:
>>>> ($person 'set #:name "nala" #:age 100)
>>>> BTW, please don't forget to config your DB in conf/artanis.conf first.
>>>> Best regards.
>>>> Jonathan Schmeling writes:
>>>>> Gotcha. That makes a lot of sense. Thanks a ton for explaining!
>>>>> Database related, is there a way to query the database from one of the 
>>>>> controller -define methods (like (article-define show …) in the online 
>>>>> documentation)? Using the function map-table-from-DB causes an error and 
>>>>> attaching #:conn #t, like with the get function, also causes an error. 
>>>>> Doing something like (:conn rc "SELECT * FROM PEOPLE") seems to work (or, 
>>>>> at least, not throw an error) but I'm not sure what gets returned. The 
>>>>> doc. says the returned value is described at 
>>>>> but 
>>>>> that section says "TODO".
>>>>> As always, any help is always super appreciated!
>>>>> Jonathan
>>>>> On 2/17/19 12:19 PM, Nala Ginrut wrote:
>>>>> Hi Jonathan!
>>>>> I'm glad you asked this question.
>>>>> The answer is actually written in the fprm.scm code comments that the
>>>>> relational mapping in Artanis is not going to provide database level
>>>>> foreign keys. The solution is to provide higher-abstract-level table
>>>>> operations as a replacement to save users to time to handle by
>>>>> themselves.
>>>>> The pros and cons of foreign keys are discussed a lot in the
>>>>> internet. The modern ORM may choose to drop foreign keys and provide
>>>>> higher layer for it.
>>>>> Unfortunately, this feature has not been implemented yet because of my 
>>>>> time schedule.
>>>>> Of course, this issue is still open, the original plan is more
>>>>> ambitious. I think it's the time to add more features to the relational
>>>>> mapping framework.
>>>>> Welcome to discuss if you like.
>>>>> Best regards.
>>>>> Jonathan Schmeling writes:
>>>>> I'm not sure if it's been asked before but I couldn't find any mention
>>>>> in the doc. – is it feasible to define foreign keys for the create-table
>>>>> function? I want to reference another table's primary keys from a
>>>>> particular table, to link them.
>>>>> Jonathan
>> --
>> GNU Powered it
>> GPL Protected it
>> GOD Blessed it
>> HFG - NalaGinrut
>> Fingerprint F53B 4C56 95B5 E4D5 6093 4324 8469 6772 846A 0058

GNU Powered it
GPL Protected it
GOD Blessed it
HFG - NalaGinrut
Fingerprint F53B 4C56 95B5 E4D5 6093 4324 8469 6772 846A 0058

Attachment: signature.asc
Description: PGP signature

reply via email to

[Prev in Thread] Current Thread [Next in Thread]