Een Python Datetime.Datetime-object invoegen in MySQL

Ik heb een datumkolom in een MySQL-tabel. Ik wil een datetime.datetime()-voorwerp in deze kolom invoegen. Wat moet ik gebruiken in de uitvoerende verklaring?

Ik heb geprobeerd:

now = datetime.datetime(2009,5,5)
cursor.execute("INSERT INTO table
(name, id, datecolumn) VALUES (%s, %s
, %s)",("name", 4,now))

Ik krijg een foutmelding als: "TypeError: not all arguments converted during string formatting"
Wat moet ik gebruiken in plaats van %s?


Antwoord 1, Autoriteit 100%

Gebruik voor een tijdveld:

import time    
time.strftime('%Y-%m-%d %H:%M:%S')

Ik denk strftimeis ook van toepassing op datetime.


Antwoord 2, Autoriteit 20%

U krijgt waarschijnlijk de TypeError omdat u citaten nodig hebt rond de DATECOLUMN-waarde.

Probeer:

now = datetime.datetime(2009, 5, 5)
cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, '%s')",
               ("name", 4, now))

Met betrekking tot het formaat had ik succes met het bovenstaande commando (inclusief de milliseconden) en met:

now.strftime('%Y-%m-%d %H:%M:%S')

Ik hoop dat dit helpt.


Antwoord 3, Autoriteit 6%

Probeer now.date()te gebruiken om een ​​Dateobject te krijgen in plaats van een datetime.

Als dat niet werkt, moet het converteren van dat naar een string werkt:

now = datetime.datetime(2009,5,5)
str_now = now.date().isoformat()
cursor.execute('INSERT INTO table (name, id, datecolumn) VALUES (%s,%s,%s)', ('name',4,str_now))

Antwoord 4, Autoriteit 5%

Gebruik Python-methode datetime.strftime(format), waar indeling = '%Y-%m-%d %H:%M:%S'.

import datetime
now = datetime.datetime.utcnow()
cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, %s)",
               ("name", 4, now.strftime('%Y-%m-%d %H:%M:%S')))

TIMEZONES

Als tijdzones een zorg hebben, kan de MySQL-timezone als volgt worden ingesteld op UTC:

cursor.execute("SET time_zone = '+00:00'")

en de tijdzone kunnen worden ingesteld in Python:

now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)

MySQL-documentatie

MySQL herkent datetime- en tijdstempelwaarden in deze indelingen:

Als een tekenreeks in ‘YJYY-MM-DD HH: MM: SS’ of ‘YY-MM-DD HH: MM: SS’
formaat. Een “ontspannen” syntaxis is ook toegestaan, ook: elke interpunctie
karakter kan worden gebruikt als de scheidingsteken tussen datumonderdelen of -tijd
onderdelen. Bijvoorbeeld ‘2012-12-31 11:30:45’, ‘2012 ^ 12 ^ 31 11 + 30 + 45’,
‘2012/12/31 11 * 30 * 45’, en ‘2012 @ 12 @ 31 11 ^ 30 ^ 45’ zijn equivalent.

De enige scheidingsteken die wordt erkend tussen een datum en tijdsdeel en een
Fractional Second Part is het decimale punt.

De datum- en tijdonderdelen kunnen door T in plaats van een ruimte worden gescheiden. Voor
Voorbeeld: ‘2012-12-31 11:30:45’ ‘2012-12-31T11: 30: 45’ zijn equivalent.

Als een tekenreeks zonder scheidingstekens in ofwel ‘yyyymmddhhmmss’ of
‘Yymmddhhmms’s-formaat, op voorwaarde dat de string zinvol is als een datum.
‘20070523091528’ en ‘070523091528’ worden bijvoorbeeld geïnterpreteerd als
‘2007-05-23 09:15:28’, maar ‘071122129015’ is illegaal (het heeft een
onzinnige minute deel) en wordt ‘0000-00-00 00:00:00’.

Als een cijfer in yyyymmddhhmmss of yymmddhhmms-indeling, verstrekt
dat het nummer zinvol is als een datum. Bijvoorbeeld 19830905132800 en
830905132800 worden geïnterpreteerd als ’83-09-05 13:28:00′.


Antwoord 5

Met welke database maakt u verbinding? Ik weet dat Oracle kieskeurig kan zijn over datumnotaties en houdt van het ISO 8601-formaat.

**Opmerking: Oeps, ik lees net dat je MySQL gebruikt. Formatteer gewoon de datum en probeer het als een aparte directe SQL-aanroep om te testen.

In Python kun je een ISO-datum krijgen zoals

now.isoformat()

Oracle houdt bijvoorbeeld van dates als

insert into x values(99, '31-may-09');

Afhankelijk van uw database, als het Oracle is, moet u het misschien TO_DATE:

insert into x
values(99, to_date('2009/05/31:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam'));

Het algemene gebruik van TO_DATE is:

TO_DATE(<string>, '<format>')

Als je een andere database gebruikt (ik zag de cursor en dacht Oracle; ik kan het mis hebben), controleer dan hun datumnotatietools. Voor MySQL is dit DATE_FORMAT() en SQL Server is dit CONVERT.

Ook het gebruik van een tool als SQLAlchemyzal dergelijke verschillen wegnemen en uw leven gemakkelijker maken.


Antwoord 6

Als je alleen een python datetime.date gebruikt (geen volledige datetime.datetime), cast je de datum gewoon als een string. Dit is heel eenvoudig en werkt voor mij (mysql, python 2.7, Ubuntu). De kolom published_dateis een MySQL-datumveld, de python-variabele publish_dateis datetime.date.

# make the record for the passed link info
sql_stmt = "INSERT INTO snippet_links (" + \
    "link_headline, link_url, published_date, author, source, coco_id, link_id)" + \
    "VALUES(%s, %s, %s, %s, %s, %s, %s) ;"
sql_data = ( title, link, str(publish_date), \
             author, posted_by, \
             str(coco_id), str(link_id) )
try:
    dbc.execute(sql_stmt, sql_data )
except Exception, e:
    ...

Antwoord 7

   dt= datetime.now()
    query = """INSERT INTO table1(python_Date_col)
               VALUES (%s)
            """
    conn = ...... # Connection creating process
    cur = conn.cursor()
    cur.execute(query,(dt))

Bovenstaande code mislukt omdat “datetime.now()” “datetime.datetime(2014, 2, 11, 1, 16)” produceert als een parameterwaarde om de instructie in te voegen.

Gebruik de volgende methode om de datetime vast te leggen die stringwaarde geeft.

   dt= datetime.now().strftime("%Y%m%d%H%M%S")

Ik kon de code na de wijziging met succes uitvoeren…


Antwoord 8

bij het invoegen in t-sql

dit mislukt:

select CONVERT(datetime,'2019-09-13 09:04:35.823312',21)

dit werkt:

select CONVERT(datetime,'2019-09-13 09:04:35.823',21)

eenvoudige manier:

regexp = re.compile(r'\.(\d{6})')
def to_splunk_iso(dt):
    """Converts the datetime object to Splunk isoformat string."""
    # 6-digits string.
    microseconds = regexp.search(dt).group(1)
    return regexp.sub('.%d' % round(float(microseconds) / 1000), dt)

Other episodes