Thread: [SQLObject] very newbie: how to start with SQLObject ?
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: Stef M. <ste...@gm...> - 2009-02-02 20:55:38
|
hello, until now I used SQL directly, but to create functional code, independent of the chosen database, I'm looking for something different. So I found SQLObject and SQLAlchemy, and can't find out from the discussions which is better suited for my purposes, so I decided to give both a try. I started with SQLObject because in general it's decribed as "easier". So I started here: http://www.sqlobject.org/SQLObject.html The first problem is that the first example already contains an error ( at least that's what I guess) connection_string = 'sqlite:' + db_filename I think there's a slash missing ? Now the second problem is, that I want to start with an existing database: So this is my code: from sqlobject import * class Test_Create2 ( SQLObject ) : class sqlmeta : print 'piep' fromDatabase = True if __name__ == '__main__': DataBase_Name = 'D:/Data_Python_25/support/test_vl.db' sqlhub.processConnection = connectionForURI ( 'sqlite:/' + DataBase_Name ) Test_Create2.createTable () and this the error I get: Traceback (most recent call last): File "D:\Data_Python_25\support\db_support.py", line 507, in <module> class Test_Create2 ( SQLObject ) : File "p:\python\lib\site-packages\SQLObject-0.10.4-py2.5.egg\sqlobject\declarative.py", line 92, in __new__ cls.__classinit__(cls, new_attrs) File "p:\python\lib\site-packages\SQLObject-0.10.4-py2.5.egg\sqlobject\main.py", line 791, in __classinit__ cls.sqlmeta.addColumnsFromDatabase() File "p:\python\lib\site-packages\SQLObject-0.10.4-py2.5.egg\sqlobject\main.py", line 446, in addColumnsFromDatabase conn = connection or soClass._connection File "p:\python\lib\site-packages\SQLObject-0.10.4-py2.5.egg\sqlobject\dbconnection.py", line 829, in __get__ return self.getConnection() File "p:\python\lib\site-packages\SQLObject-0.10.4-py2.5.egg\sqlobject\dbconnection.py", line 842, in getConnection "No connection has been defined for this thread " AttributeError: No connection has been defined for this thread or process thanks, Stef Mientki |
From: Oleg B. <ph...@ph...> - 2009-02-02 21:12:39
|
On Mon, Feb 02, 2009 at 09:55:35PM +0100, Stef Mientki wrote: > I started with SQLObject because in general it's decribed as "easier". Welcome! > So I started here: > > http://www.sqlobject.org/SQLObject.html > > The first problem is that the first example already contains an error ( > at least that's what I guess) > > connection_string = 'sqlite:' + db_filename > > I think there's a slash missing ? Yes. Thank you! > Now the second problem is, > that I want to start with an existing database: > > So this is my code: > > from sqlobject import * > class Test_Create2 ( SQLObject ) : > class sqlmeta : > print 'piep' > fromDatabase = True > > if __name__ == '__main__': > DataBase_Name = 'D:/Data_Python_25/support/test_vl.db' > sqlhub.processConnection = connectionForURI ( 'sqlite:/' + > DataBase_Name ) > Test_Create2.createTable () > > and this the error I get: > Traceback (most recent call last): [skip] > "No connection has been defined for this thread " > AttributeError: No connection has been defined for this thread or process fromDatabase works at the class creation time and hence requires that the connection is created before the class is being created: sqlhub.processConnection = connectionForURI(...) class Test_Create2(SQLObject): ... Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Stef M. <ste...@gm...> - 2009-02-02 22:47:05
|
> [skip] > >> "No connection has been defined for this thread " >> AttributeError: No connection has been defined for this thread or process >> > > fromDatabase works at the class creation time and hence requires that > the connection is created before the class is being created: > > sqlhub.processConnection = connectionForURI(...) > class Test_Create2(SQLObject): > ... > > thanks Oleg, that seems to work: but now it complains it can't open the database def makeConnection(self): if self._memory: return self._memoryConn print 'PPPPP',self.filename return sqlite.connect(self.filename, **self._connOptions) prints: PPPPP /D:/Data_Python_25/support/test_vl.db now I think there's a slash too much :-( Now I wonder, is SQLObject suited for MS-Windows ? Ok, let's try a relative path, then it prints PPPPP /test_vl.db still a slash too much I guess, but it does come further : ValueError: The table test__create2 ws not found in the database. Load failed Now it's creating an extra underscore ??? Any suggestions ? thnaks, Stef Mientki |
From: Oleg B. <ph...@ph...> - 2009-02-02 23:04:37
|
On Mon, Feb 02, 2009 at 10:46:42PM +0100, Stef Mientki wrote: > now I think there's a slash too much :-( > Now I wonder, is SQLObject suited for MS-Windows ? My company sells commercial programs for w32; some of these programs use SQLObject pretty heavily. On the server side we use SQLite for small clients and PostgreSQL for bigger ones. Well, we use sqlite:///path/to/data.base syntax with ':' replaced by '|': sqlite:///C|program/data.db. This is how we do it: cwd = os.getcwd() cwd_uri = cwd.replace(os.sep, '/') if os.name == 'nt': cwd_uri = '/' + cwd_uri.replace(':', '|') > ValueError: The table test__create2 ws not found in the database. Load > failed > > Now it's creating an extra underscore ??? No idea. I am sure it is not an SQLObject's error. Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Daniel F. <fet...@go...> - 2009-02-03 02:40:51
|
> So I found SQLObject and SQLAlchemy, > and can't find out from the discussions which is better suited for my > purposes, so I decided to give both a try. It mostly depends on the size and sophistication of your project. For small to mid sized projects sqlobject might be better since it's MUCH easier to use, less verbose, etc. I'm only using sqlobject since my projects are kinda small or mid-sized. Once I gave sqlalchemy a try but it's so complicated and verbose for simple tasks as well that I quickly changed my mind and went back to sqlobject. Apparently sqlalchemy is good for large complex database problems but since I don't have any I don't see any benefit to using sqlalchemy over sqlobject. Cheers, Daniel -- Psss, psss, put it down! - http://www.cafepress.com/putitdown |
From: Stef M. <ste...@gm...> - 2009-02-03 17:14:28
|
On Tue, Feb 3, 2009 at 12:04 AM, Oleg Broytmann <ph...@ph...> wrote: > On Mon, Feb 02, 2009 at 10:46:42PM +0100, Stef Mientki wrote: > > now I think there's a slash too much :-( > > Now I wonder, is SQLObject suited for MS-Windows ? > > My company sells commercial programs for w32; some of these programs use > SQLObject pretty heavily. On the server side we use SQLite for small > clients > and PostgreSQL for bigger ones. > Well, we use sqlite:///path/to/data.base syntax with ':' replaced by > '|': sqlite:///C|program/data.db. This is how we do it: > > cwd = os.getcwd() > cwd_uri = cwd.replace(os.sep, '/') > if os.name == 'nt': > cwd_uri = '/' + cwd_uri.replace(':', '|') This is absolutely weird, I've never seen this in my whole live ! Must be a Linux trick ;-) > > > > ValueError: The table test__create2 ws not found in the database. Load > > failed > > > > Now it's creating an extra underscore ??? > > No idea. I am sure it is not an SQLObject's error. As I've nowhere typed 2 underscores in my 5 lines of code, and I only use SQLObject, despite I don't have any understanding of SQLObject, I definitely say it's a SQLObject bug !! If on the error line, I explictly fill in the correct tablename (with just 1 underscore), the program runs a bit further, and now stops here: # This isn't strictly true, since we *could* use backquotes or # " or something (database-specific) around column names, but # why would anyone *want* to use a name like that? # @@: I suppose we could actually add backquotes to the # dbName if we needed to... if not forceDBName: assert sqlbuilder.sqlIdentifier(name), 'Name must be SQL-safe (letters, numbers, underscores): %s (or use forceDBName=True)' \ % repr(name) assert name != 'id', 'The column name "id" is reserved for SQLObject use (and is implicitly created).' assert name, "You must provide a name for all columns" There seems to have been more problems with table names and columns names, but the above states clear that underscores are allowed. The error complains about invalid column names, so apparently it has read the table information, and the table names are so simple 'Field1', 'Field2' , etc Or I'm doing something completely wrong, or I do things different from other users ( e.g. starting with already existing database), or no-one has really tested SQLObject with sqlite3. Any other possibilities ? ;-) thanks, Stef Mientki > > > Oleg. > -- > Oleg Broytmann http://phd.pp.ru/ ph...@ph... > Programmers don't die, they just GOSUB without RETURN. > > > ------------------------------------------------------------------------------ > Create and Deploy Rich Internet Apps outside the browser with > Adobe(R)AIR(TM) > software. With Adobe AIR, Ajax developers can use existing skills and code > to > build responsive, highly engaging applications that combine the power of > local > resources and data with the reach of the web. Download the Adobe AIR SDK > and > Ajax docs to start building applications today- > http://p.sf.net/sfu/adobe-com > _______________________________________________ > sqlobject-discuss mailing list > sql...@li... > https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss > |
From: Oleg B. <ph...@ph...> - 2009-02-03 17:51:37
|
On Tue, Feb 03, 2009 at 06:14:24PM +0100, Stef Mientki wrote: > > Well, we use sqlite:///path/to/data.base syntax with ':' replaced by > > '|': sqlite:///C|program/data.db. This is how we do it: > > This is absolutely weird Not at all. This is how web-browsers used to support file://-URLs on w32. > There seems to have been more problems with table names and columns names, > but the above states clear that underscores are allowed. > The error complains about invalid column names, > so apparently it has read the table information, > and the table names are so simple 'Field1', 'Field2' , etc > > Or I'm doing something completely wrong, > or I do things different from other users ( e.g. starting with already > existing database), > or no-one has really tested SQLObject with sqlite3. > Any other possibilities ? ;-) Or trying to use SQLObject with a database that SQLObject fails to handle. SQLObject has some requirements, most notable - there have to be a primary key in the table, of type INT or CHAR, with the name 'id'; if it's not named 'id' you have to provide an explicit name: class MyTable(SQLObject): class sqlmeta: idName = 'my_id' Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Stef M. <ste...@gm...> - 2009-02-03 19:17:23
|
Oleg Broytmann wrote: > On Tue, Feb 03, 2009 at 06:14:24PM +0100, Stef Mientki wrote: > >>> Well, we use sqlite:///path/to/data.base syntax with ':' replaced by >>> '|': sqlite:///C|program/data.db. This is how we do it: >>> >> This is absolutely weird >> > > Not at all. This is how web-browsers used to support file://-URLs on > w32. > That must be a long time ago, for decades I use "file:///D:/...." > >> There seems to have been more problems with table names and columns names, >> but the above states clear that underscores are allowed. >> The error complains about invalid column names, >> so apparently it has read the table information, >> and the table names are so simple 'Field1', 'Field2' , etc >> >> Or I'm doing something completely wrong, >> or I do things different from other users ( e.g. starting with already >> existing database), >> or no-one has really tested SQLObject with sqlite3. >> Any other possibilities ? ;-) >> > > Or trying to use SQLObject with a database that SQLObject fails to > handle. SQLObject has some requirements, most notable - there have to be > a primary key in the table, of type INT or CHAR, with the name 'id'; if > it's not named 'id' you have to provide an explicit name: > > class MyTable(SQLObject): > class sqlmeta: > idName = 'my_id' > > That explains. thanks Oleg, cheers, Stef |