[Sqlalchemy-commits] [1404] sqlalchemy/trunk/lib/sqlalchemy: fixed a _get_criterion mismatch, cleane
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-05-05 17:23:12
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1404] sqlalchemy/trunk/lib/sqlalchemy: fixed a _get_criterion mismatch, cleaned up types + updated types doc</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1404</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-05 12:23:00 -0500 (Fri, 05 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>fixed a _get_criterion mismatch, cleaned up types + updated types doc</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunkdocbuildcontentdocument_basemyt">sqlalchemy/trunk/doc/build/content/document_base.myt</a></li> <li><a href="#sqlalchemytrunkdocbuildcontenttypestxt">sqlalchemy/trunk/doc/build/content/types.txt</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingmapperpy">sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemymappingquerypy">sqlalchemy/trunk/lib/sqlalchemy/mapping/query.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemytypespy">sqlalchemy/trunk/lib/sqlalchemy/types.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunkdocbuildcontentdocument_basemyt"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/content/document_base.myt (1403 => 1404)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/content/document_base.myt 2006-05-05 16:25:43 UTC (rev 1403) +++ sqlalchemy/trunk/doc/build/content/document_base.myt 2006-05-05 17:23:00 UTC (rev 1404) </span><span class="lines">@@ -24,7 +24,7 @@ </span><span class="cx"> onepage='documentation' </span><span class="cx"> index='index' </span><span class="cx"> title='SQLAlchemy Documentation' </span><del>- version = '0.1.6' </del><ins>+ version = '0.1.7' </ins><span class="cx"> </%attr> </span><span class="cx"> </span><span class="cx"> <%method title> </span></span></pre></div> <a id="sqlalchemytrunkdocbuildcontenttypestxt"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/doc/build/content/types.txt (1403 => 1404)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/doc/build/content/types.txt 2006-05-05 16:25:43 UTC (rev 1403) +++ sqlalchemy/trunk/doc/build/content/types.txt 2006-05-05 17:23:00 UTC (rev 1404) </span><span class="lines">@@ -23,6 +23,7 @@ </span><span class="cx"> class Float(Numeric): </span><span class="cx"> def __init__(self, precision=10) </span><span class="cx"> </span><ins>+ # DateTime, Date, and Time work with Python datetime objects </ins><span class="cx"> class DateTime(TypeEngine) </span><span class="cx"> </span><span class="cx"> class Date(TypeEngine) </span><span class="lines">@@ -38,11 +39,11 @@ </span><span class="cx"> # as bind params, raw bytes to unicode as </span><span class="cx"> # rowset values, using the unicode encoding </span><span class="cx"> # setting on the engine (defaults to 'utf-8') </span><del>- class Unicode(String) </del><ins>+ class Unicode(TypeDecorator) </ins><span class="cx"> </span><span class="cx"> # uses the pickle protocol to serialize data </span><span class="cx"> # in/out of Binary columns </span><del>- class PickleType(Binary) </del><ins>+ class PickleType(TypeDecorator) </ins><span class="cx"> </span><span class="cx"> More specific subclasses of these types are available, which various database engines may choose to implement specifically, allowing finer grained control over types: </span><span class="cx"> </span><span class="lines">@@ -76,53 +77,25 @@ </span><span class="cx"> </span><span class="cx"> ### Creating your Own Types {@name=custom} </span><span class="cx"> </span><del>-User-defined types can be created, to support either database-specific types, or customized pre-processing of query parameters as well as post-processing of result set data. You can make your own classes to perform these operations. They are specified by subclassing the desired type class: </del><ins>+User-defined types can be created, to support either database-specific types, or customized pre-processing of query parameters as well as post-processing of result set data. You can make your own classes to perform these operations. To augment the behavior of a `TypeEngine` type, such as `String`, the `TypeDecorator` class is used: </ins><span class="cx"> </span><span class="cx"> {python title="Basic Example"} </span><span class="cx"> import sqlalchemy.types as types </span><span class="cx"> </span><del>- class MyType(types.String): </del><ins>+ class MyType(types.TypeDecorator): </ins><span class="cx"> """basic type that decorates String, prefixes values with "PREFIX:" on </span><span class="cx"> the way in and strips it off on the way out.""" </span><ins>+ impl = types.String </ins><span class="cx"> def convert_bind_param(self, value, engine): </span><span class="cx"> return "PREFIX:" + value </span><span class="cx"> def convert_result_value(self, value, engine): </span><span class="cx"> return value[7:] </span><ins>+ +The `Unicode` and `PickleType` classes are instances of `TypeDecorator` already and can be subclassed directly. </ins><span class="cx"> </span><del>-A common desire is for a "pickle" type, which overrides a Binary object to provide pickling behavior: </del><ins>+To build a type object from scratch, which will not have a corresponding database-specific implementation, subclass `TypeEngine`: </ins><span class="cx"> </span><del>- {python title="Pickle Type"} - import cPickle - - class PickleType(Binary): - def __init__(self, protocol=pickle.HIGHEST_PROTOCOL): - """allows the pickle protocol to be specified""" - self.protocol = protocol - def convert_result_value(self, value, engine): - if value is None: - return None - buf = Binary.convert_result_value(self, value, engine) - return pickle.loads(str(buf)) - def convert_bind_param(self, value, engine): - if value is None: - return None - return Binary.convert_bind_param(self, pickle.dumps(value, self.protocol), engine) - def get_constructor_args(self): - return {} - -Which can be used like: - </del><span class="cx"> {python} </span><del>- mytable = Table('mytable', engine, - Column('id', Integer, primary_key=True), - Column('data', PickleType())) - - my_object = MyObject() - mytable.insert().execute(data=my_object) - -Another example, which illustrates a fully defined datatype. This just overrides the base type class TypeEngine: - - {python} </del><span class="cx"> import sqlalchemy.types as types </span><span class="cx"> </span><span class="cx"> class MyType(types.TypeEngine): </span><span class="lines">@@ -134,7 +107,4 @@ </span><span class="cx"> return value </span><span class="cx"> def convert_result_value(self, value, engine): </span><span class="cx"> return value </span><del>- def adapt_args(self): - """allows for the adaptation of this TypeEngine object into a new kind of type depending on its arguments.""" - return self </del><span class="cx"> </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py (1403 => 1404)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-05-05 16:25:43 UTC (rev 1403) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/mapper.py 2006-05-05 17:23:00 UTC (rev 1404) </span><span class="lines">@@ -450,6 +450,22 @@ </span><span class="cx"> self._options[optkey] = mapper </span><span class="cx"> return mapper </span><span class="cx"> </span><ins>+ def _get_criterion(self, key, value): + """used by select_by to match a key/value pair against + local properties, column names, or a matching property in this mapper's + list of relations.""" + if self.props.has_key(key): + return self.props[key].columns[0] == value + elif self.table.c.has_key(key): + return self.table.c[key] == value + else: + for prop in self.props.values(): + c = prop.get_criterion(key, value) + if c is not None: + return c + else: + return None + </ins><span class="cx"> def __getattr__(self, key): </span><span class="cx"> if (key.startswith('select_by_') or key.startswith('get_by_')): </span><span class="cx"> return getattr(self.query, key) </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemymappingquerypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/mapping/query.py (1403 => 1404)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/mapping/query.py 2006-05-05 16:25:43 UTC (rev 1403) +++ sqlalchemy/trunk/lib/sqlalchemy/mapping/query.py 2006-05-05 17:23:00 UTC (rev 1404) </span><span class="lines">@@ -177,7 +177,7 @@ </span><span class="cx"> for key, value in params.iteritems(): </span><span class="cx"> if value is False: </span><span class="cx"> continue </span><del>- c = self._get_criterion(key, value) </del><ins>+ c = self.mapper._get_criterion(key, value) </ins><span class="cx"> if c is None: </span><span class="cx"> raise InvalidRequestError("Cant find criterion for property '"+ key + "'") </span><span class="cx"> if clause is None: </span><span class="lines">@@ -261,18 +261,3 @@ </span><span class="cx"> value.setup(key, statement, **kwargs) </span><span class="cx"> return statement </span><span class="cx"> </span><del>- def _get_criterion(self, key, value): - """used by select_by to match a key/value pair against - local properties, column names, or a matching property in this mapper's - list of relations.""" - if self.props.has_key(key): - return self.props[key].columns[0] == value - elif self.table.c.has_key(key): - return self.table.c[key] == value - else: - for prop in self.props.values(): - c = prop.get_criterion(key, value) - if c is not None: - return c - else: - return None </del></span></pre></div> <a id="sqlalchemytrunklibsqlalchemytypespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/types.py (1403 => 1404)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/types.py 2006-05-05 16:25:43 UTC (rev 1403) +++ sqlalchemy/trunk/lib/sqlalchemy/types.py 2006-05-05 17:23:00 UTC (rev 1404) </span><span class="lines">@@ -67,7 +67,9 @@ </span><span class="cx"> def convert_result_value(self, value, engine): </span><span class="cx"> return self.impl.convert_result_value(value, engine) </span><span class="cx"> def copy(self): </span><del>- raise NotImplementedError() </del><ins>+ instance = self.__class__.__new__(self.__class__) + instance.__dict__.update(self.__dict__) + return instance </ins><span class="cx"> </span><span class="cx"> def to_instance(typeobj): </span><span class="cx"> if typeobj is None: </span><span class="lines">@@ -132,8 +134,6 @@ </span><span class="cx"> return value.decode(engine.encoding) </span><span class="cx"> else: </span><span class="cx"> return value </span><del>- def copy(self): - return Unicode(self.impl.length) </del><span class="cx"> </span><span class="cx"> class Integer(TypeEngine): </span><span class="cx"> """integer datatype""" </span><span class="lines">@@ -194,8 +194,6 @@ </span><span class="cx"> if value is None: </span><span class="cx"> return None </span><span class="cx"> return self.impl.convert_bind_param(pickle.dumps(value, self.protocol), engine) </span><del>- def copy(self): - return PickleType(self.protocol) </del><span class="cx"> </span><span class="cx"> class Boolean(TypeEngine): </span><span class="cx"> pass </span></span></pre> </div> </div> </body> </html> |