artanis
[Top][All Lists]
Advanced

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

Re: [Artanis] Foreign Key for Migrations


From: Jonathan Schmeling
Subject: Re: [Artanis] Foreign Key for Migrations
Date: Sun, 14 Apr 2019 03:17:28 +0000

Thanks a ton for the explanation!

Still model-related, how might one pick two columns as primary keys for 
models?

Also, – if I've not once said so in all the times I've E-mailed you – 
thank you for making Artanis. Guile's my first pick when it comes to 
languages and I'd wanted a web-framework I could use it with and Artanis 
is just an utter joy to work with. It's so nice being able to write this 
with Guile like this.

And, – on that note – I know you mentioned foreign relational mapping 
still needing some work to be developed. I don't know how useful I can 
be (most of Artanis's source code still goes over my head, a bit) but, 
if I can be of help, I'd love to give back what I can.

Jonathan

On 3/24/19 1:46 AM, Nala Ginrut wrote:
> 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:
>>>>> https://www.gnu.org/software/artanis/manual/manual.html#orgeff2a47
>>>>>
>>>>> And maybe read its implementation is clearer to you:
>>>>> https://gitlab.com/NalaGinrut/artanis/blob/master/artanis/mvc/model.scm#L226
>>>>>
>>>>> 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 
>>>>>> https://www.gnu.org/software/artanis/manual/manual.html#org8ba121f 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

reply via email to

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