David Megginson added a comment to my earlier post, arguing that using "SELECT *" is an example of loose binding rather than tight binding, as I suggested it is. However, it seems to me that (reading between the lines somewhat) David's approach is to select all columns in the database table, but then only access particular named columns in the result set that he gets back. If that is right, then in some sense it's the same approach, but with the loose binding strategy applied at a slightly different place in the architecture.
Choose for yourself which approach is easier to debug, and which approach you can more reliably check that your developers have followed faithfully. A key reason for banning "SELECT *" in larger projects is that it is straightforward to scan all of the queries that the database receives and see who has tried to run a "SELECT *" query. It's usually rather more difficult to check that code which uses "SELECT *" implements some other approach to protecting itself from breaking when the number of returned columns changes.
As I've mentioned from time to time, there is no such thing as best practices. There are only practices which are good practices in a particular context, in a particular set of circumstances. Choose for yourself which approach to loose coupling to databases best matches your circumstances.