sql_gen.py: ValueCond and Join class hierarchies inherit from objects.BasicObject like Code does
sql.py: put_table(): ignore(): Fixed bug where value needed to be filtered through repr(). NullValueException: Fixed bug where value passed to ignore() was the string 'NULL' instead of the value None.
mappings/DwC2-VegBIEN.specimens.csv: plantname.rank: Filter through _toTaxonrank
sql.py: put_table(): ignore(): Avoid infinite loops by asserting that in_col is not in conds
objects.py: BasicObject: Fixed bug where util needed to be imported. Added eq() and hash().
strings.py: Removed no longer used DebugPrintable (that functionality is now in objects.BasicObject)
sql_gen.py: Code: Inherit from new objects.BasicObject
Added objects.py
sql.py: put_table(): Renamed log_ignore() to ignore() and factored common conds-modifying code into it
sql.py: put_table(): Moved post-insert code outside while loop because it will now always be run (there are no longer special cases where the postprocessing doesn't happen)
sql.py: put_table(): Missing mapping for NOT NULL column: Just create an empty pkeys table, since the missing rows' pkeys will be set to NULL later
sql.py: put_table(): Joining together output and input pkeys: Use new sql_gen.join_same_not_null
sql.py: put_table(): Setting missing rows' pkeys to NULL: Use new sql_gen.join_same_not_null
sql_gen.py: Join: Added join_same_not_null. to_str(): Refactored to switch order of left and right tables and cols because left_table is on the right in the comparison, and using the sides of the comparison instead of the sides of the join makes the code clearer.
sql_gen.py: Renamed join_using to join_same to reflect that it can also be used without USING
sql.py: put_table(): Set missing rows' pkeys to NULL
sql.py: put_table(): NullValueException: no mapping for missing col: Fixed bug where run_query_into_pkeys() was still using insert_joins instead of input_joins
sql_gen.py: Added MockDb. All str() methods: Use self.to_str() with mockDb.
sql_gen.py: Use db.esc_name() instead of sql.esc_name(db, ...) so passed-in db can be a mock object
sql.py: DbConn: Added esc_name()
db_xml.py: put_table(): Debug-print which columns are being put
sql.py: ConstraintException, NullValueException: Improved error messages
sql.py: put_table(): FunctionValueException: Fixed bug where out_table was still assumed to be an escaped string, but is now a Table object
sql.py: mk_select(): joins: Use new table_not_null_col() instead of pkey() to get a non-NULL column to filter out on
exc.py: add_msg(): Fixed bug where msg needed to be converted to a unicode object before appending it to another unicode object
mappings/VegX-VegBIEN.stems.csv: Fixed bug where taxonfit was named taxonFit. (This was only recently discovered because column names are now escaped, causing them not to be case-insensitive.)
sql.py: Added table_not_null_col()
sql.py: Added table_cols() and use it in pkey()
schemas/vegbien.sql, schemas/functions.sql: Relational functions: Added dummy not_null column to provide a column to use in LEFT JOIN filter-out filters
sql.py: mk_insert_select(): embeddable: Use new sql_gen.NamedTable
sql_gen.py: Added NamedTable. Table: Added to_Table().
sql_gen.py: Added section labels for each type of SQL code object
sql.py: put_table(): DuplicateKeyException: Fixed bug where dict_subset_right_join() was used instead of dict_subset(), adding spurious None values for columns in the constraint which are not in the input tables
sql_gen.py: as_Col(): Don't allow None cols
schemas/vegbien.ERD.mwb: Synced with schemas/vegbien.sql
sql.py: Removed no longer used clean_name()
sql.py: mk_insert_select(): embeddable: Removed clean_name() because the function name is now escaped where it's used
sql.py: put_table(): Added support for out_table values that are Table objects
sql.py: mk_insert_select(): Fixed bug where table for creating the returning column Col object was the already-escaped string, instead of the Table object
sql.py: mk_insert_select(): Fixed bug where function name and returning col were not being escaped
sql.py: put_table(): log_ignore(): Fixed bug where in_col needed to be passed through str() because it's a column object
sql.py: put_table(): Fixed bug where the filter_out join should only be used in the insert, not in the select of existing/inserted rows. insert_select() call: Fixed compatibility bug where old versions of Python did not support mixing keyword args and ** args.
sql.py: put_table(): Fixed bug where "add_row_num(db, out_pkeys_ref0)" was mistakenly put under the "if row_ct_ref != None" if statement
sql_gen.py: Renamed NamedCode to NamedCol to better reflect its specific use
sql.py: Removed unnecessary calls to check_name()
sql.py: mk_insert_select(): Fixed bug where returning col was not being escaped
sql.py: add_row_num(): Fixed bug where table name was not being escaped
sql.py: run_query_into(): Fixed bug where into table name was not being escaped
sql.py: mk_insert_select(): Fixed bug where utput column names were not being escaped
sql.py: put_table(): Fixed bug where only string columns were being included in the distinct_on, but columns are now always sql_gen.Col instances
sql.py: put_table(): Put together varying insert_select() args using dict instead of individual vars
sql.py: mk_select(): Fixed bug where order_by needed to default to None if distinct_on was used. Fixed bug where cond values were being treated as %s params in addition to being parsed by sql_gen.as_ValueCond().to_str().
sql_gen.py: Col: Added to_Col()
db_xml.py: put_table(): Accept sql_gen.Table objects or strings instead of separate table and schema names
sql.py: put_table(): Require all in_table_cols to be sql_gen.Col objects
sql_gen.py: ValueCond: Unwrap NamedCode objects
sql_gen.py: NamedCode: Inherit from Col so that its name can be retrieved using the same attribute as Col's
sql.py: put_table(): Debug-log each caught exception
exc.py: str_(): Added first_line_only param to return just the first line
sql.py: ConstraintException: Changed text of message to specify that a constraint was violated
sql.py: Renamed ExceptionWithColumns to ConstraintException and added name field to contain the constraint name, if any
sql.py: put_table(): If there are join_cols, don't get output pkeys of inserted rows and instead select all rows (existing and inserted) after the insert
sql_gen.py: Join.to_str(): Fixed bug where order of right_table_col and left_table_col was reversed when applying as_ValueCond() and as_Col()
sql.py: put_table(): Moved things outside of the try clause which should not produce the exceptions
sql_gen.py: Code: Extend new strings.DebugPrintable instead of implementing str(), repr() itself
strings.py: Added DebugPrintable
sql_gen.py: Code: str(): Added class name. Added repr().
util.py: Added class_name()
sql_gen.py: Join.to_str(): Fixed bug in USING syntax where columns were not escaped
sql.py: put_table(): Order selects by in_tables0's pkey to avoid undefined orderings on multiple runs of the same query
sql.py: mk_select(): Removed no longer used esc_name_()
sql_gen.py: as_Table() Removed no longer used support for (schema, table) tuples
sql_gen.py: Removed no longer used unescape_table() and table2sql_gen()
sql.py: mk_select(): Removed no longer used table_is_esc
sql.py: mk_insert_select(): Removed no longer used table_is_esc
sql.py: pkey(): Removed no longer used table_is_esc
sql.py: cleanup_table(): Switched from table_is_esc to sql_gen.as_Table.to_str()
csv2db: Switched to using plain table names rather than table_is_esc
bin/map: Switched to using sql_gen rather than table_is_esc
sql_gen.py: Removed no longer needed col2sql_gen() and value2sql_gen()
sql.py: Replaced sql_gen.value2sql_gen() with sql_gen.as_Col()
sql.py: Replaced sql_gen.col2sql_gen() with sql_gen.as_Col()
sql.py: mk_select(): Inline cond() and don't use sql_gen.as_Col because sql_gen.as_ValueCond.to_str() calls it
sql_gen.py: Removed no longer needed cond2sql_gen()
sql.py: mk_select(): cond(): Parse conditions using sql_gen-only functions
sql_gen.py: Removed no longer needed join2sql_gen()
sql.py: put_table(): Switched joins to sql_gen.Join objects. mk_select(): Only accept joins which are sql_gen.Join objects.
sql.py: put_table(): Removed no longer used table_is_esc param
sql.py: put_table(): Switched joins to sql_gen.Join objects
sql.py: mk_select(): joins: Switched to using sql_gen.Join.to_str() to render joins to SQL
sql_gen.py: Join.to_str(): Fixed bugs revealed in first test of function
db_xml.py: put_table(): Turn off table_is_esc when calling sql.put_table() and don't escape out_table
sql.py: mk_insert_select(): Use sql_gen.table2sql_gen().to_str() to escape the table
db_xml.py: put_table(): First in_tables table is sql_gen.Table object
db_xml.py: put_table(): Converted row (mapping) values to sql_gen objects
sql.py: mk_select(): Accept main tables (table0's) that are Table objects. This change requires plain SQL code to be wrapped in a CustomCode object if it should not be unescaped and converted to a Table object.
sql_gen.py: as_Table(): Accept tables that are Code objects, not just Table objects
sql_gen.py: CustomCode: Fixed bug where needed to inherit from Code
sql.py: put_table(): Return a sql_gen.Col object instead of an old-style tuple
sql.py: mk_select(): joins: Switched to using filter_out as an attribute of the Join object instead of a sentinel value for the first column. Filter by the right table's pkey being NULL instead of each joined column being NULL, because some joined columns may contain NULL values which would mess things up, but the pkey presumably is NOT NULL.