Getting Started with a Database
David Burgun
dburgun at dsl.pipex.com
Thu Feb 16 07:53:35 EST 2006
Hi,
Thank you all so much! WIth this information (and all the other
posts) I am just bound to get something working for Monday!
On 15 Feb 2006, at 19:19, Trevor DeVore wrote:
> On Feb 15, 2006, at 7:58 AM, David Burgun wrote:
>> Ok, that's great, but I don't have any database to import, I want
>> to create a new one from scratch. Is there anyway to do this using
>> libDatabase (with either Version 2 or 1) ?
>
> libDatabase has the functions necessary to execute the SQL commands
> necessary to create a database. You would use libdb_executeSQL
> with something like this:
>
> get lidb_executeSQL("DatabaseIdentifier", "CREATE TABLE myobjects
> (ID int(11) NOT NULL auto_increment, Name varchar(255) NOT NULL,
> Type char(4) NOT NULL, Size int(11), ImageFilePathName varchar(255)
> NOT NULL, PRIMARY KEY(ID))")
> Usually it is easier to create your tables with CocoaMySQL though,
> then just use libDB to connect to the database. For one table it
> isn't a big deal but the graphic interface helps you know what
> options are available when creating columns.
>
Great! I understand now! I couldn't figure out where CocoaMySQL came
into it.
>> Ok, I understand now, thanks. One question, will libDatabase 1.x
>> work with the version "MySQL" that I have already installed?
>
> Yes. libDB just sits on top of RevDB and the Valentina externals
> (1.x and 2.x).
>
>> I tried that already! They like what they see as implemented as a
>> Card Database. An SQL database is the main feature of the app and
>> something that I said (maybe by mistake) would be no problem under
>> RunRev. The rest of the app I coded really quickly and have it
>> working just fine, now all they want is to see it working with an
>> SQL database. They will use the SQL database with other
>> applications, not just the one I am working on.
>
> Okay, let's see if we can get this working then.
>
>> All my Stack needs to do is:
>>
>> 1. Create the Database.
>> I have a list of image files in a folder, the name field is the
>> name of the file, the Type and Size fields are determined by
>> looking up the name in a text file and the path is just the local
>> path to the image file. This operation can (and will be slow) but
>> this is acceptable since it will only be performed once.
>
> You can separate creating and populating the database into two
> different tasks if you would like. You can create the database
> with something similar to the code I posted above or with CocoaMySQL.
>
> You would then use libDB to populate the database. So perhaps you
> could do something like this (libDB version 2 syntax):
>
> --> REGISTER CONNECTION SETTINGS
> put "mysql" into tDBA["Type"]
> put "localhost" into tDBA["Host"]
> put "myobjects" into tDBA["Name"]
> put "root" into tDBA["Username"]
> put "" into tDBA["Password"]
>
> libdb_registerDatabase "mydb", tDBA
>
> try
> --> TO DO: CREATE LIST OF IMAGES. tImages CONTAINS VALUES
> repeat for each line tImage in tImages
> --> TO DO: LOOKUP IMAGE TYPE AND SIZE. tType AND tSize CONTAIN
> VALUES
> put tImage into tAddA["Name"]
> put tType into tAddA["Type"]
> put tSize into tAddA["Size"]
> put tPathToImageFolder & slash & tImage into tAddA
> ["ImageFilePathName"]
>
> --> ADD TO DATABASE
> put libdb_addToTable("mydb", "myobjects", tAddA, "ID") into
> tAffectedRows
> end repeat
> catch e
> answer "A database error occurred:" && e
> end try
>
>> 2. Retrieve from the Database.
>> The user enters a name, the record with this name is returned.
>
> --> CREATE THE QUERY. THIS IS A BASIC "CONTAINS" QUERY.
> local tDataA
>
> try
> put "SELECT * FROM myobjects WHERE Name LIKE '%" & tSearchString
> & "%'" into tSQL
>
> --> USE LIBDB FUNCTION FOR CONVERTING A QUERY TO AN ARRAY. FOR
> BETTER PERFORMANCE, YOU CAN USE
> --> LIBDB CURSOR FUNCTIONS LATER ON IF YOU WANT.
> get libdb_getTableRecords("mydb", tDataA, tSQL)
>
> --> tDataA IS NOT AN ARRAY CONTAINING ALL RETURNED RECORDS. THE
> "Length" KEY CONTAINS THE NUMBER
> --> OF RECORDS RETURNED.
> --> POPULATE FIELD WITH RESULTS.
> repeat with i = 1 to tDataA["Length"]
> put tDataA["Data",i,"Title"] & tab & tDataA["Data",i,"ID"] & cr
> after tResults
> end repeat
> delete the last char of tResults
>
> set the text of field "MyResults" to tResults
> catch e
> answer "A database error occurred:" && e
> end try
>
>> Is this really a massive learning curve? I have until Monday to
>> get this and some other purely RunRev stuff working, surely that's
>> enough time to do this?
>
> Well, this should get you started. A list of things you will want
> to read up on eventually:
>
> 1) SQL syntax for creating databases and tables, altering tables,
> updating records, optimizing queries, etc.
> 2) Dealing with drivers. It is good to understand what drivers you
> are distributing and why. MySQL has the revdb files in addition to
> a mysql driver. altSQLite just has the revdb driver. Valentina is
> a separate external (I recommend against using Valentina with revDB).
> 3) Performance tuning. Proper design and indexing of databases can
> really affect performance in some cases. It is good to study up on
> these concepts.
>
> There are probably other things as well but that is a good start.
>
Absolutely FANTASTIC, exactly what I was hoping for! With this and a
bit of playing I can get the demo up and running!
Once I have got this panic out of the way, I will spend some time and
try to produce a "Getting Started" Stack that will build a sample
database from Scratch and make it available to anyone that need to
get started.
Thanks Again, IOU 6 beers!
All the Best
Dave
More information about the use-livecode
mailing list