Retrieving possible list for use in a subsequent INSERT

Nick the Gr33k nikos.gr33k at gmail.com
Fri Nov 1 12:00:11 EDT 2013


Στις 1/11/2013 5:56 μμ, ο/η Joel Goldstick έγραψε:
> On Fri, Nov 1, 2013 at 11:25 AM, Nick the Gr33k <nikos.gr33k at gmail.com> wrote:
>> Στις 31/10/2013 9:22 μμ, ο/η rurpy at yahoo.com έγραψε:
>>>
>>> On 10/31/2013 03:24 AM, Nick the Gr33k wrote:
>>>
>>>> [...]
>>>> # find out if visitor has downloaded torrents in the past
>>>>          cur.execute('''SELECT torrent FROM files WHERE host = %s''', host
>>>> )
>>>>          data = cur.fetchall()
>>>>
>>>>          downloads = []
>>>>          if data:
>>>>                  for torrent in data:
>>>>                          downloads.append( torrent )
>>>>          else:
>>>>                  downloads.append( 'None Yet' )
>>>>
>>>> # add this visitor entry into database
>>>> cur.execute('''INSERT INTO visitors (counterID, refs, host, city,
>>>> useros, browser, visits, downloads) VALUES (%s, %s, %s, %s, %s, %s, %s,
>>>> %s)''', (cID, refs, host, city, useros, browser, visits, downloads) )
>>>> [...]
>>>
>>>
>>> and
>>>
>>> On 10/31/2013 03:32 AM, Nick the Gr33k wrote:
>>>>
>>>> The error seen form error log is:
>>>>
>>>> [Thu Oct 31 09:29:35 2013] [error] [client 46.198.103.93]
>>>> [Thu Oct 31 09:29:35 2013] [error] [client 46.198.103.93] Traceback
>>>> (most recent call last):
>>>> [Thu Oct 31 09:29:35 2013] [error] [client 46.198.103.93]   File
>>>> "/home/nikos/public_html/cgi-bin/metrites.py", line 274, in <module>
>>>> [Thu Oct 31 09:29:35 2013] [error] [client 46.198.103.93]     (cID,
>>>> refs, host, city, useros, browser, visits, downloads) )
>>>>
>>>> [Thu Oct 31 09:29:35 2013] [error] [client 46.198.103.93]
>>>> pymysql.err.InternalError: (1241, 'Operand should contain 1 column(s)')
>>>>
>>>> line 274 is:
>>>>
>>>> # add this visitor entry into database
>>>> cur.execute('''INSERT INTO visitors (counterID, refs, host, city,
>>>> useros, browser, visits, downloads) VALUES (%s, %s, %s, %s, %s, %s, %s,
>>>> %s)''',  (cID, refs, host, city, useros, browser, visits, downloads) )
>>>
>>>
>>>
>>> You set the value of 'downloads' to a list:
>>>
>>>>          downloads = []
>>>>          if data:
>>>>                  for torrent in data:
>>>>                          downloads.append( torrent )
>>>
>>>
>>> and when you use 'downloads', use have:
>>>
>>>     INSERT INTO visitors (..., downloads) VALUES (..., %s), (...,
>>> downloads)
>>>
>>> If the 'downloads' column in table 'visitors' is a
>>> normal scalar value (text string or such) then perhaps
>>> you can't insert a value that is a list into it?  And
>>> that may be causing your problem?
>>>
>>> If that is in fact the problem (I am only guessing), you
>>> could convert 'downloads' to a single string for insertion
>>> into your database with something like,
>>>
>>>     downloads = ', '.join( downloads )
>>>
>>
>>
>> I would like to know if there's a way to store an entire list into a MySQL
>> table.
>> --
>> [code]
>>                  # find out if visitor had downloaded torrents in the past
>>
>>                  cur.execute('''SELECT torrent FROM files WHERE host = %s''',
>> host )
>>                  data = cur.fetchall()
>>
>>                  downloads = []
>>                  if data:
>>                          for torrent in data:
>>                                  downloads.append( torrent )
>>                  else:
>>                          downloads = 'None Yet'
>>
>>
>>                  # add this visitor entry into database (host && downloads
>> are unique)
>>                  cur.execute('''INSERT INTO visitors (counterID, refs, host,
>> city, useros, browser, visits, downloads) VALUES (%s, %s, %s, %s, %s, %s,
>> %s, %s)''', (cID, refs, host, city, useros, browser, visits, downloads) )
>> [/code]
>>
>>
>> If the 'downloads' column in table 'visitors' is a
>> normal scalar value (text string or such) then perhaps
>> i cannot insert a value that is a list into it.
>>
>>  From within my python script i need to to store a list variable into a mysql
>> column.
>>
>> the list is suppose to store torrent filenames in a form of
>>
>> downloads = ["movie1", "movie2", "movie3", "movie3"]
>>
>>
>> is enum or set column types what needed here as proper columns to store
>> 'download' list?
>>
>> Code:
>>
>> create table visitors
>> (
>>    counterID integer(5) not null,
>>    host varchar(50) not null,
>>    refs varchar(25) not null,
>>    city varchar(20) not null,
>>    userOS varchar(10) not null,
>>    browser varchar(10) not null,
>>    hits integer(5) not null default 1,
>>    visits datetime not null,
>>    downloads set('None Yet'),
>>
>>    foreign key (counterID) references counters(ID),
>>    unique index (visits)
>>   )ENGINE = MYISAM;
>>
>>
>> Is the SET column type the way to do it?
>> i tried it but the error i'm receiving is:
>>
>>
>> pymysql.err.InternalError: (1241, 'Operand should contain 1 column(s)')
>>
>> Please help pick the necessary column type that will be able to store a a
>> list of values.
>> --
>> https://mail.python.org/mailman/listinfo/python-list
>
> If you have a list of values of the same type, but different values,
> you need a new table with a foreign key to the table it relates to.
> This is a relational database question.  You can read more here:
>
> http://en.wikipedia.org/wiki/Database_normalization#Normal_forms
>



I can create another table for filenames and use a many to many 
relationship between them because many movies can be downloaded by a 
visitor and many visitors can download a movie.

That could work, but i wish to refrain from creating another mysql 
tabale just to store a couple of movies the visitor could or could not 
download.

Just a mysql column table that will be able to store a list(movies the 
visitor selected) should do.



More information about the Python-list mailing list