On Tue, Apr 29, 2014 at 7:14 PM, Ben Finney <b...@benfinney.id.au> wrote: > Larry Martell <larry.mart...@gmail.com> writes: > >> I am having a problem building a connect string for pyodbc. It works >> when everything is hard coded, but if I build the connect string it >> fails. >> >> This works: >> >> pyodbc.connect('DRIVER=FreeTDS;' 'SERVER=xx.xx.xx.xx;' 'PORT=1433;' >> 'DATABASE=blah;' 'UID=foo;' 'PWD=bar;') > > This calls the function with a single string, > "DRIVER=FreeTDS;SERVER=xx.xx.xx.xx;PORT=1433;DATABASE=blah;UID=foo;PWD=bar;". > > Remember that consecutive, whitespace-separated, quote-delimited > fragments specify the construction of a single string literal:: > > >>> 'foo' > 'foo' > >>> 'foo' 'bar' > 'foobar' > >>> 'foo' 'bar' 'baz' > 'foobarbaz' > > See the reference for how this concatenation occurs > <URL:https://docs.python.org/3/reference/lexical_analysis.html#string-literal-concatenation>. > >> But this does not: >> >> pyodbc.connect(conn_str) >> >> Where conn_str is: >> >> 'DRIVER=FreeTDS;' 'SERVER=xx.xx.xx.xx;' 'PORT=1433;' 'DATABASE=blah;' >> 'UID=foo;' 'PWD=bar;' > > This string is different, because it contains a whole lot of quotation > marks and whitespace not in the string you show in the first example. > >> conn_str is constructed with: >> >> conn_str = "'DRIVER=%s;' 'SERVER=%s;' 'PORT=%s;' 'DATABASE=%s;' >> 'UID=%s;' 'PWD=%s;'" \ >> % (RECIPE_DB['DRIVER'], RECIPE_DB['SERVER'], >> RECIPE_DB['PORT'], RECIPE_DB['DATABASE'], >> RECIPE_DB['USER'], RECIPE_DB['PASSWORD']) > > Remove the extraneous quotes and whitespace, which were not in the > original string you showed above. > > On a separate point: Since you have string keys for the mapping, you can > make the interpolation more readable:: > > conn_str = ( > "DRIVER=%(DRIVER)s;SERVER=%(SERVER)s;PORT=%(PORT)s;" > "DATABASE=%(DATABASE)s;UID=%(USER)s;PWD=%(PASSWORD)s;" > ) % RECIPE_DB > > since the named placeholders will be looked up by key in the ‘RECIPE_DB’ > mapping. > > There are other improvements to suggest, but I don't want to distract > from the main point of the post.
Thanks for the explanation. -- https://mail.python.org/mailman/listinfo/python-list