Re: Autoincrement support for Sqlite3

Russ Tyndall <[email protected]> Wed, 16 Oct 2013 13:56:10 -0400
Newsgroups gmane.lisp.clsql.general
Message-ID <[email protected]>
I will supply comments and review via github.

Thanks much for your efforts,
Russ Tyndall
Acceleration.net


On 10/16/2013 10:40 AM, Victor wrote:
> Hi Russ,
>
> Thanks for your advice. I was finally able to make autoincrement to work
> to a degree when a very simple and basic test passes (from the gist)
>
> The changes are here:
>
> https://github.com/vityok/clsql/commit/4332610851d855ebc858f231f06cff81c675e5f2
>
> Sample gist is here:
>
> https://gist.github.com/vityok/6993172
>
> I will submit a pull request to merge in these changes. Please modify
> them to better fit the rest of the library.
>
> Thanks,
> Victor
>
>
> On Tue, 15 Oct 2013 20:17:29 +0300, Russ Tyndall <[email protected]> wrote:
>
>> Hello,
>>
>> I don't have time to pursue this work and don't have need of it
>> personally (we define databases in the database then generate
>> clsql-view-classes with clsql-orm).
>>
>> However, I will offer a few pieces of advice:
>>    * The constraint name could be manipulated through some combination of
>> database-constraint-statement, make-constraints-description (by
>> investigating the backend of the current connection). (see
>> sql/expressions.lisp)
>>    * Almost every string written to the database goes through
>> database-output-sql which can be specialized on databases of type
>> sqlite3 and thus almost everything can be customized to output exactly
>> what you need it to.
>>    * create-view-from-class calls %install-class which in turn calls
>> database-generate-column-definition for each column.  The result of this
>> is passed to the create-table function that you already have working.
>> This can be specialized on database and so could be one entry point to
>> accomplishing your goals.
>>
>> The company I work for Acceleration.net is available for hire if this
>> work is important to you.  Anything accomplished would obviously be open
>> source and part of clsql moving forward. Otherwise if you do accomplish
>> this work, I will be happy to review your work, and merge it when
>> ready.  Feel free to push patches / issue pull requests to
>> https://github.com/UnwashedMeme/clsql/ for review or merging.
>>
>> Thank you for pursuing this work and endeavoring to make clsql better.
>>
>> Cheers and hope this helps,
>> Russ Tyndall
>> Acceleration.net
>>
>>
>>
>> On 10/15/2013 6:06 AM, Victor wrote:
>>> On Tue, 08 Oct 2013 16:43:59 +0300, Victor <[email protected]> wrote:
>>>
>>>> On Fri, 27 Sep 2013 19:42:52 +0300, Victor <[email protected]> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> Thanks a lot for creating such a wonderful and useful library.
>>>>>
>>>>> However, lack of autoincrement fields support for Sqlite3 databases is very inconvenient.
>>>>>
>>>>> I wanted to share a patch (partially it was submitted before) that makes it possible to work with autoincrement fields in Sqlite3 with clsql.
>>>>>
>>>>> Additional modifications might be necessary, but this patch at least makes it possible to insert objects into the database.
>>>>>
>>>>> I hope that CLSQL will have a full support for autoincrement fields in the Sqlite3 databases.
>>>> These modifications are not enough: the way how CLSQL creates tables is also important as it does not work with Sqlite3 when there are Autoincrement fields.
>>>>
>>>> The problem is that CLSQL tries to define primary keys also in the end of the columns list as a kind of constraints.
>>>>
>>> Hi all,
>>>
>>> Apparently the issue with autoincrement field support in Sqlite3 was
>>> raised a number of times before:
>>>
>>> http://lists.b9.com/pipermail/clsql-help/2006-January/000552.html
>>>
>>> However, I did not find enough patches that would add a fully
>>> functional autoincrement implementation for Sqlite3 databases.
>>>
>>> The problem is that Sqlite expects a very specific autoincrement field
>>> declaration (see http://www.sqlite.org/autoinc.html ):
>>>
>>>        INTEGER PRIMARY KEY AUTOINCREMENT
>>>
>>> But CLSQL is tuned to work with the AUTO_INCREMENT keyword and it also
>>> provides key declarations in the constraints part of the table
>>> definition.
>>>
>>> With some simple hacking and patching I am able to create tables with
>>> CLSQL CREATE-TABLE function:
>>>
>>>        (clsql:create-table [item] '(([id] integer :primary-key :autoincrement)
>>>                                     ([name] varchar)))
>>>
>>> But this is not so convenient as DEF-VIEW-FROM-CLASS function and it
>>> also requires manually patching CLSQL after it is downloaded by
>>> Quicklisp (which is not good at all).
>>>
>>> Could somebody please help making CLSQL produce proper autoincrement
>>> key definition for the Sqlite3 database?
>>>
>>> Probably a somewhat easier work-around is to use the ROWID column as a
>>> key. But it requires a view-class to have a slot that is retrieved
>>>    from the database but is not defined in the CREATE TABLE command and
>>> is not assigned on INSERT.
>>>
>>> Any help is appreciated.
>>>
>>> Thanks,
>>> Victor
>>>
>>> _______________________________________________
>>> CLSQL mailing list
>>> [email protected]
>>> http://lists.b9.com/cgi-bin/mailman/listinfo/clsql
>