MySQL'e bir Python datetime.datetime nesnesi ekleme


120

MySQL tablosunda bir tarih sütunum var. datetime.datetime()Bu sütuna bir nesne eklemek istiyorum . Execute ifadesinde ne kullanmalıyım?

Denedim:

now = datetime.datetime(2009,5,5)

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

Şu şekilde bir hata alıyorum: "TypeError: not all arguments converted during string formatting" Bunun yerine ne kullanmalıyım %s?


alıntıları kaçırdın%s cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s , '%s')",("name", 4,now))
Sheshnath

Yanıtlar:


198

Bir zaman alanı için şunu kullanın:

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

Sanırım strftime datetime için de geçerli.


4
Ayrıca, sütun adınızın ayrılmış bir kelime olmadığından emin olun . "Current_date" adının sorunlara neden olduğunu anlamam 30 dakikamı aldı ... ugh!
Pakman

2
timeBu örnekte ne var ?
James McMahon

1
J McMahon: zaman bir Python modülüdür.
dstromberg

Ya biri tek Yıl, Ay, Gün'ü almak isterse?
Pooja Khatri

42

Büyük olasılıkla TypeError'ı alıyorsunuz çünkü tarih sütunu değerinin etrafında tırnak işaretlerine ihtiyacınız var.

Deneyin:

now = datetime.datetime(2009, 5, 5)

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

Biçimle ilgili olarak, yukarıdaki komutla (milisaniyeleri içeren) başarılı oldum:

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

Bu yardımcı olur umarım.


8
Etrafa tırnak olmayabilir %sde pymsql.
Martin Thoma

1
Üçüncü% s civarında alıntılar bunu denediğimde hataya neden oluyor.
realjin

13

A yerine now.date()bir Datenesne almak için kullanmayı deneyin DateTime.

Bu işe yaramazsa, bunu bir dizeye dönüştürmek işe yaramalıdır:

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))

Dize parametrelerinin etrafına tırnak işareti eklemenize gerek yok mu, yani "... DEĞERLER ('% s', '% s', '% s')"
Gareth Simpson

5

Python yöntemini kullanın datetime.strftime(format), burada format = '%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')))

Zaman dilimleri

Saat dilimleri önemliyse, MySQL saat dilimi aşağıdaki gibi UTC için ayarlanabilir:

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

Ve saat dilimi Python'da ayarlanabilir:

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

MySQL Belgeleri

MySQL, şu formatlarda DATETIME ve TIMESTAMP değerlerini tanır:

"YYYY-AA-GG SS: DD: SS" veya "YY-AA-GG SS: DD: SS" biçiminde bir dize olarak . Burada da "rahat" bir söz dizimine izin verilmektedir: Herhangi bir noktalama karakteri, tarih bölümleri veya saat bölümleri arasında sınırlayıcı olarak kullanılabilir. Örneğin, '2012-12-31 11:30:45', '2012 ^ 12 ^ 31 11 + 30 + 45', '2012/12/31 11 * 30 * 45' ve '2012 @ 12 @ 31 11 ^ 30 ^ 45 'eşdeğerdir.

Tarih ve saat bölümü ile kesirli saniye bölümü arasında tanınan tek sınırlayıcı ondalık noktadır.

Tarih ve saat bölümleri boşluk yerine T ile ayrılabilir. Örneğin, '2012-12-31 11:30:45' '2012-12-31T11: 30: 45' eşdeğerdir.

Dizenin tarih olarak anlamlı olması koşuluyla, 'YYYYAAGGSHMMSS' veya 'YYMMDDHHMMSS' biçiminde sınırlayıcı içermeyen bir dize olarak. Örneğin, '20070523091528' ve '070523091528' '2007-05-23 09:15:28' olarak yorumlanır, ancak '071122129015' yasa dışıdır (anlamsız bir dakika bölümü vardır) ve '0000-00-00 00 olur: 00:00' .

Sayının tarih olarak anlamlı olması koşuluyla, YYYYAAGGHHMMSS veya YYMMDDHHMMSS biçiminde bir sayı olarak. Örneğin, 19830905132800 ve 830905132800, "1983-09-05 13:28:00" olarak yorumlanır.


3

Hangi veritabanına bağlanıyorsunuz? Oracle'ın tarih formatları konusunda seçici olabileceğini ve ISO 8601 formatını sevebileceğini biliyorum .

** Not: Oops, az önce MySQL'de olduğunuzu okudum. Tarihi biçimlendirin ve test etmek için ayrı bir doğrudan SQL çağrısı olarak deneyin.

Python'da aşağıdaki gibi bir ISO tarihi alabilirsiniz:

now.isoformat()

Örneğin Oracle aşağıdaki gibi tarihleri ​​sever

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

Veritabanınıza bağlı olarak, Oracle ise TO_DATE yapmanız gerekebilir:

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

TO_DATE tarihinin genel kullanımı:

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

Başka bir veritabanı kullanıyorsanız (imleci gördüm ve Oracle düşündüm; yanılıyor olabilirim) o zaman tarih biçimi araçlarını kontrol edin. MySQL için DATE_FORMAT () ve SQL Server DÖNÜŞTÜRÜLÜR.

Ayrıca SQLAlchemy gibi bir araç kullanmak bu tür farklılıkları ortadan kaldıracak ve hayatınızı kolaylaştıracaktır.


Datetime.isoformat () kullanılmasını önermiyorum çünkü saat dilimine duyarlı bir nesne kullanıyorsanız, üretilen dize saat dilimi verilerini içerir ve artık gerekli mysql biçimiyle eşleşmez.
2016,

0

Yalnızca bir python datetime.date kullanıyorsanız (tam bir datetime.datetime değil), tarihi bir dize olarak atmanız yeterlidir. Bu çok basit ve benim için çalışıyor (mysql, python 2.7, Ubuntu). Sütun published_dateMySQL tarih alanıdır, piton değişken publish_dateolduğunu 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:
    ...

0

t-sql'ye ne zaman yerleştirilir

bu başarısız:

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

bu çalışıyor:

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

kolay yol:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.